-------------------------------------------------------------------------------- WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö -------------------------------------------------------------------------------- WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #00 ÁöÀºÀÌ : Á¤ÇöÈ£ ´Ù½Ã °­Á¶õ¿¡ ±ÛÀ» ¿Ã¸®°Ô µÇ¾î ±â»Þ´Ï´Ù. ±×µ¿¾È ´õ ¸¹ÀÌ ¹ßÀüÀ» Çß¾î¾ß ¿©·¯ºÐ µé²² ÁÁÀº ±ÛÀ» µå¸±ÅÙµ¥, Àß ¸ð¸£°Ú½À´Ï´Ù. ^^; ±×µ¿¾È ª°Ô³ª¸¶ ³×Æ®¿÷ ÇÁ·Î±×·¡ ¹ÖÀ» ÇÏ¸ç ¾òÀº °ÍµéÀ» ¿©·¯ºÐ°ú ³ª´©·Á ÇÕ´Ï´Ù. Áö³­¹ø¿¡ ¿Ã¸° ±Û°ú ¸¶Âù°¡Áö·Î ±×·¸°Ô °í±Þ½º·¯¿î ³»¿ëÀ» ´Ù·ç´Â°Íµµ ¾Æ´Ï°í ³²°ú ´Ù¸¥ ¹æ¹ýÀ» Á¦½ÃÇϴ°͵µ ¾Æ´Õ ´Ï´Ù. Áö±Ý±îÁö ±×·¡¿Ô°í ¾ÕÀ¸·Îµµ ±×·²°ÍÀÌÁö¸¸, óÀ½ ½ÃÀÛÇϽô ºÐµé²² °¡ÀÌµå ¶óÀÎÀ» Àâ¾Æµå¸®´Â Á¤µµÀÇ ¼öÁØÀÏ °ÍÀÔ´Ï´Ù. [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] 0. ÇöÀç º¸°í °è½Å ¸Ó¸´¸» ºñ½ÁÇÑ Àâ´ã. ^^; 1. ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Åë½Å °³·Ð. 2. À©µµ¿ì ¼ÒÄÏÀ̶õ? 3. À©µµ¿ì ¼ÒÄÏ ÃʱâÈ­¿Í ¼­¹ö ÇÁ·Î±×·¥ 4 Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥. 5. ¾²·¹µå( Thread ). 6. À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ µ¥ÀÌÅÍ ¼Û¼ö½Å. 7. TCP¿Í UDPÀÇ Â÷ÀÌÁ¡. 8. ÇÁ·ÎÅäÄÝ ¼³°è¿Í º¸¾È¹®Á¦. 9. äÆà ¼­¹ö/Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î ºÁ¿ä~ ´ë°­ ÀÌÁ¤µµ³×¿ä. ¾ÆÁ÷ ±í°Ô °øºÎ¸¦ ÇÏÁö ¸øÇؼ­ ½ÇÁ¦ »ó¿ë ³×Æ®¿÷ °ÔÀÓ¿¡¼­³ª º¼ ¼ö ÀÖ´Â ³ëÇÏ¿ìµé±îÁö´Â ¸ø ´Ù·çÁö ¸ø ÇÒ°Í °°½À´Ï´Ù¸¸, ±× ³ëÇÏ¿ì ºÎºÐÀº ¿©·¯ºÐ µé ÀڽŠÁ÷Á¢ ¾ò¾î¾ßÇÒ ºÎºÐÀ̶ó »ý°¢ÇÕ´Ï´Ù. ¸ð¸£´Â °É ÀÌ·± Çΰè·Î ³Ñ±â´Â ^^; ¾Æ¸¶µµ Àú³ª ³×Æ®¿÷À» óÀ½ °øºÎ ÇϽô ¿©·¯ºÐÀ̳ª °¡Á³´ø Àǹ®À̳ª ¾î·Æ°Ô ´À³¢ °í ÀÖ¾ú´ø ȤÀº ¾î·Æ°Ô ´À³¥ ºÎºÐÀº ±×·¸°Ô ´Ù¸£Áö ¾ÊÀ» °ÍÀ̶ó »ý°¢ÇÕ´Ï´Ù. ^^; ±×·¡¼­ ¾ÕÀ¸·Î ÁøÇàµÉ ³»¿ëµé ´ëºÎºÐÀÌ Á¦°¡ ¾î·Æ°Ô ȤÀº ÀǾÆÇÏ°Ô »ý°¢Çß´ø ºÎºÐ µéÀÌ µÇÁö ¾ÊÀ»±î ½Í½À´Ï´Ù. ³×Æ®¿÷¿¡ ´ëÇÑ ±âÃÊ Áö½ÄÀÌ ºÎÁ·ÇÑ ÀúÀÌÁö¸¸ Á¦ ±ÛÀÌ »õ·Ó°Ô ÀÌ ³×Æ®¿÷À̶ó´Â ºÐ¾ß¿¡ ÀÔ¹®ÇϽŠºÐµé²² ÀÛ°Ô³ª¸¶ µµ¿òÀÌ µÇ¾úÀ¸¸é ÇÕ´Ï ´Ù. [Áغñ¹°] 0. ½ß½ßÇÑ ÄÄÇ»ÅÍ ÇÑ ´ë. 1. À©µµ¿ì °è¿­ÀÇ ¿î¿µÃ¼Á¦.(°¡´ÉÇϸé 98/À©2K) 2. À©µµ¿ì ¼ÒÄÏ API¸¦ ó¸®ÇÒ¼ö ÀÖ´Â ÄÄÆÄÀÏ·¯( VC++ ) 3. LanÄ«µå(Å×½ºÆ®¿ëÀ¸·Î ÇʼöÀÔ´Ï´Ù. ¾øÀ¸¸é ´çÀå ±¸ºñÇϽʽÿä.) 4. À©µµ¿ì ¼ÒÄÏ °ü·Ã¹®¼­ ȤÀº Ã¥. ÀÖÀ¸¸é ÁÁ°í ¾øÀ¸¸é ¾ø´Âµ¥¿ä...... ^^; 5. ±âÃÊÀûÀÎ C¾ð¾î ±¸Çö´É·Â. 6. ±Ù¼º( °¡Àå Áß¿äÇÏÁÒ. ^^ ) ´ç¿¬ÇÑ À̾߱âÁö¸¸ ¸ðµ©, ·£Ä«µå, ȤÀº IP¾÷ü(µÎ·ç³Ý, µå¸²¶óÀεî)¿¡¼­ IP¸¦ ÇÒ ´ç ¹ÞÀ¸¼Å¾ßÇÕ´Ï´Ù. ±×·¡¾ß Åë½ÅÀ» ÇϱâÀ§ÇÑ Çϵå¿þ¾î°¡ ¸¶·ÃµÇ´Â ¼ÀÀÌÁÒ. °¡Àå °¡ °Ý´ë ¼º´Éºñ°¡ ÁÁÀº°Ç ·£Ä«µå¸¸ ´Þ¶û ÀåºñÇÏ´Â °æ¿ìÀÔ´Ï´Ù. ¿ë»ê°¡¸é ´ë¸¸Á¦ 1¸¸¿ø ¼± Á¦Ç°µéÀÌ ¸¹½À´Ï´Ù. ÇöÀç 100¸Þ°¡ Á¦Ç°ÀÌ ¸¹ÀÌ À¯ÅëµÇ°í ÀÖÀ»°Ì´Ï´Ù. ¸ðµ©Àº Çö ½ÇÀûÀ¸·Î ¹«¸®°¡ ¸¹ÁÒ. ÀüÈ­ ¿ä±Ý¹®Á¦µµ ÀÖ°í ´À¸° ¼Óµµµî ¹®Á¦°¡ ¸¹ÁÒ. ´ÙÀ½Àº IP¾÷ü¿¡ °¡ÀÔÇÏ´Â °æ¿ìÀε¥, ¾ÆÁ÷±îÁöµµ µÎ·ç³ÝÀÌ ±ò¸®Áö ¾Ê´Â Áö¿ªµµ ÀÖ°í ´Þ¸¶ ´Ù ³»´Â ¿ä±ÝÀÌ ºÎ´ãÀÌ µÇ´Â°æ¿ìµµ ÀÖÀ»°Ì´Ï´Ù. °¡Àå ½Ñ ¸À¿¡ ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ·£Ä«µå¸¸À» ÀåÂøÇÏ°í °¡»óÀ¸·Î µ¥ÀÌÅ͸¦ ¼Û/¼ö½ÅÇØ º¸´Â °Ì´Ï´Ù. Àúµµ óÀ½¿¡ ÀÌ ¹æ¹ýÀ¸·Î ½ÃÀÛÇß°í, ¹«¸®µµ ¾ø¾ú½À´Ï´Ù. ¹°·Ð °¡»óÀ¸·Î ÀÚ½ÅÀÇ ÄÄÇ»Å;ȿ¡¼­ µ¥ÀÌ Å͸¦ ÁÖ°í ¹Þ±â ¶§¹®¿¡ ½ÇÁ¦ ³×Æ®¿÷¿¡¼­ ¹ß»ýÇÒ¼ö ÀÖ´Â ¹®Á¦¿¡ ´ëÇÑ ´ëó¶óµçÁö ½ÇÁ¦ ³×Æ®¿÷ ¼Óµµ¸¦ ´À³¥¼ö ¾ø´Ù´Â ´ÜÁ¡ÀÌ ÀÖ±â´Â ÇÏÁö¸¸, óÀ½¿¡ Àß ¸ð¸£´Âµ¥ ±¦È÷ ºñ½Ñµ· µé¿©°¡¸é¼­±îÁö ÇÒ ÇÊ¿ä´Â ¾ø´Ù°í º¾´Ï´Ù. ^^; ±×³ªÀú³ª À̹ø ±ÛÀº »ó´çÈ÷ ºÎ´ãÀÌ µÇ´Â±º¿ä. ¹¹ ¾ðÁ¦³ª ±×·¸µíÀÌ Á¦°¡ ¾ÆÁÖ Àß Çؼ­ ±ÛÀ» ¿Ã·È´ø °æ¿ì´Â ¾ø¾úÁö¸¸¿ä. ^^; À̹øÀº Á¤¸» °ÅÀÇ ¹«¸ðÇÒ Á¤µµ·Î ±×³É ¾´ °ÍÀÌ ¾Æ´ÒÁö¶ó´Â Àǹ®ÀÌ Àֳ׿ä. °á°ú´Â Á¦ ±Û°ú ¿¹Á¦¸¦ ¸¶Áö¸·±îÁö º¸½ÅÈÄ¸é ³ª¿ÃÅ×Áö¸¸ ¿ÀÈ÷·Á óÀ½ Á¢ÇÏ´Â ºÐµé²² ´õ È¥¶õÀ» ÁÖ´Â°Ç ¾Æ´ÑÁö °ÆÁ¤ÀÔ´Ï´Ù. "óÀ½ ½ÃÀÛÇϽô ºÐµé²² ÁÁÀº °¡ÀÌµå ¶óÀÎÀÌ µÇ¾úÀ¸¸é......" À̶ó´Â Èñ¸ÁÀ» °¡Áö°í °è¼Ó À̾°¡°Ú½À´Ï´Ù. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #01 ÁöÀºÀÌ : Á¤ÇöÈ£ * À̹ø °Ô½Ã¹°Àº °¡º­¿î ¸¶À½À¸·Î ÀоîÁÖ½Ã¸é µË´Ï´Ù. ÇÏÁö¸¸, °Ô½Ã¹° ÈĹݺο¡ ³ª ¿À´Â OSI 7 Layer´Â ²À ÀÌÇظ¦ ÇØ ÁÖ¼Å¾ß ÇÕ´Ï´Ù. ³×Æ®¿÷¿¡ ´ëÇÑ ±âÃÊÀûÀÎ ±¸Á¶ ¸¦ ÀÌÇØÇÒ ¼ö ÀÖ´Â ºÎºÐÀ̱⠶§¹®ÀÔ´Ï´Ù. ¶ÇÇÑ IP, Æ÷Æ®, ÆÐŶ¿¡ °üÇÑ °³³ä ÀÌÇØ ¶ÇÇÑ ÇʼöÀÔ´Ï´Ù. [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *[¼Û¼ö½Å ¹æ½Ä¿¡ µû¸¥ ºÐ·ù] *[³×Æ®¿÷ ÅäÇ÷ÎÁö] *[On Line / Off Line] *[OSI 7 Layer] *[ÀÎÅͳݿ¡¼­ µ¥ÀÌÅÍ´Â ¾î¶»°Ô Àü¼ÛµÉ±î?] 1. ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Åë½Å °³·Ð. Åë½ÅÀÌ ¹»±î¿ä? ±¹¾î »çÀü¿¡¼­ Á¤È®ÇÑ Á¤ÀǸ¦ ã¾Æ º¸Áö´Â ¾Ê¾Ò½À´Ï´Ù¸¸, ÀÚ½ÅÀÇ ÀÇ°ßÀ» ³²¿¡°Ô ¾Ë¸®´Â ¹æ¹ýµéÀ» Åë½ÅÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù°í »ý°¢ÇÕ´Ï´Ù. Áö±Ý ¿©·¯ºÐ Àº Á¦ ±ÛÀ» ÀÐ°í °è½Ã°í Àú´Â ¿©·¯ºÐ°ú Àú´Â Åë½ÅÀ» ÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô µûÁö¸é Åë½ÅÀÇ ¹æ¹ýÀº ¾ÆÁÖ ¸¹ÁÒ? ÀüÈ­, TV, ÄÄÇ»ÅÍ Åë½Å, ÀÎÅͳݵîµî »ý°¢ÇØ º¸¸é ²Ï ¸¹ Àº ¹æ¹ýÀ¸·Î Àΰ£Àº ¼Ò½ÄÀ» ÀüÇÒ ¼ö ÀÖ°í Àü´Þ ¹ÞÀ»¼ö ÀÖ½À´Ï´Ù. ¾ÕÀ¸·Î ¿©·¯ºÐµé °ú °°ÀÌ ´Ù·ç°Ô µÉ ³»¿ëÀº ±× Áß ÇÑ °¡ÁöÀÎ ÄÄÇ»Å͸¦ ÀÌ¿ëÇÑ Åë½ÅÀÔ´Ï´Ù. ¸¹Àº Åë ½Å ¹æ¹ý Áß ´ÜÁö Çϳª¸¦ ´Ù·ç´Â °Í »ÓÀÔ´Ï´Ù. Ç×»ó ÀÌÁ¡À» ¸í½ÉÇϼ¼¿ä. Åë½ÅÀº ÀÚ ½ÅÀÇ ÀÇ°ßÀ» ³²¿¡°Ô ¾Ë¸®´Â ÇÑ°¡Áö ¹æ¹ýÀÏ »ÓÀ̶ó´Â Á¡. ±×¸®°í ±×·¸°Ô ÇÏ·Á¸é ¾î ¶»°Ô ÇØ¾ß ÇÒ±î?¿¡ ´ëÇÑ ¹°À½°ú ±×¿¡ ´ëÇÑ ´äÀ» ã¾Æ º¸½Ê½Ã¿ä. ±×°ÍÀÌ Åë½Å ÇÁ·Î ±×·¥À» Â¥¾ßÇÒ ¿©·¯ºÐµéÀÌ ¾ÕÀ¸·Î ³ª°¡¾ßÇÒ ¹æÇâÀÔ´Ï´Ù. ´ÜÁö, ¿©·¯ºÐµéÀº ´Ù¸¥ »ç ¶÷µé°ú ´Þ¸® ÄÄÇ»Å͸¦ ÀÌ¿ëÇÏ´Â °Í»ÓÀÔ´Ï´Ù. ¾Æ·¡¿¡ ³ª¿À´Â ³»¿ëµéÀº ¾ÕÀ¸·Î ¿©·¯ºÐµé°ú °°ÀÌ À©µµ¿ì ¼ÒÄÏÇÁ·Î±×·¥À̶ó´Â °ÍÀ» ¾Ë¾Æ³ª°¡´Âµ¥ ±×¸® Å« ¿ªÇÒÀ» ÇÏÁö´Â ¾ÊÁö¸¸, »ó½Ä Â÷¿ø¿¡¼­ ´Ù·é ºÎºÐµéÀÔ´Ï´Ù. ²À ¿Ü¿ï ÇÊ¿ä°¡ ¾ø´Â ºÎºÐµµ ÀÖ°í ²À ¾Ë¾ßÇÒ ºÎºÐµµ ÀÖ½À´Ï´Ù. °Ô½Ã¹° Àü¹ÝºÎ¿¡¼­ Áß¿äÇÏ´Ù°í ¾ð±ÞÇÑ ºÎºÐµé¸¸ ÁßÁ¡ÀûÀ¸·Î ºÁ µÎ½Ã¸é µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. -[¼Û¼ö½Å ¹æ½Ä¿¡ µû¸¥ ºÐ·ù]--------------------------------------------- *½ÉÇ÷º½º(Simplex) A -> B ÇÑ ÁöÁ¡¿¡¼­ ´Ù¸¥ ÁöÁ¡À¸·Î¸¸ º¸³¾ ¼ö ÀÖ´Â ¹æ½ÄÀÔ´Ï´Ù. °¡Àå ÁÁÀº ¿¹´Â TV³ª ¶óµð ¿À °°Àº Åë½Å ¸Åü °°½À´Ï´Ù. ¹°·Ð ½ÃûÀÚ ¼Ò°¨À̳ª ¹æ¼Û±¹¿¡ Ç×ÀǸ¦ ÇÏ¸é ¾ç ¹æÇâ Åë½ÅÀ̶ó°í »ý°¢ ÇÒ¼öµµ ÀÖ°Ú½À´Ï´Ù¸¸...... ^^; ´ëºÎºÐ TV¸¦ ÅëÇØ ÇÑ °÷¿¡¼­ º¸³» ´Â ¹æ¼ÛÀ» ÀϹæÀûÀ¸·Î º¸°í µè±â¿¡ À§¿Í °°ÀÌ ¼³¸íÀ» Çß½À´Ï´Ù. *ÇÏÇÁ-µàÇ÷º½º( Half-Duplex ) A -> B ¶Ç´Â A <- B ¾ç¹æÇâ Åë½ÅÀÌ °¡´ÉÇϱä ÇÏÁö¸¸, ÇÑ ÂÊ¿¡¼­ ´Ù¸¥ ÂÊÀ¸·Î Åë½Å ³»¿ëÀ» º¸³»°í ÀÖÀ» ¶§ ¹Ý´ëÂÊÀº ¹ÞÀ»¼ö¸¸ ÀÖ°í º¸³»Áö´Â ¸øÇÏ´Â °æ¿ì¶ó°í »ý°¢ÇÏ½Ã¸é °£´ÜÇϸ®¶ó º¾´Ï ´Ù. ¸¶¶¥È÷ ÁÁÀº ¿¹°¡ ¶°¿À¸£Áö´Â ¾ÊÁö¸¸, ¿ìÆí ½Ã½ºÅÛÀ» »ý°¢ÇØ º¸¸é ¾î¶³±î¿ä? ÇÑÂÊ¿¡¼­ ÆíÁö¸¦ ¾²¸é ¹Ý´ëÂÊÀº ÆíÁö¸¦ ¹Þ°í ´Ù½Ã ¹Ý´ëÂÊÀ¸·Î ´ä½ÅÀ» ÇÏ´Â »óȲ. ¾çÂÊÀ¸·Î Åë½ÅÀÌ ÀÌ·ç¾îÁö´Â ÇÏÁö¸¸, µ¿½Ã¿¡ ÀÌ·ç¾îÁöÁö´Â ¾Ê´Â °æ¿ìÁÒ. *Ç®-µàÇ÷º½º( Full-Duplex ) A <-> B ¾ç ¹æÇâ Åë½ÅÀÌ °¡´ÉÇÑ °æ¿ìÀÔ´Ï´Ù. ÀüÈ­°¡ ÁÁÀº ¿¹°Ú±º¿ä. »ý°¢ÇØ º¸¸é À§ÀÇ ¿ë¾îµé¸¸ÀÌ ³·¼³À» »ÓÀÌÁö ¿©·¯ºÐµéÀº ¸ðµÎ Çѹø¾¿Àº °æÇèÇØ º¸ ½Å Ä£±ÙÇÑ ¹æ½ÄµéÀ̶ó »ý°¢µË´Ï´Ù. ¾Ë°Ô ¸ð¸£°Ô ¿©·¯ºÐÀ̳ª Àú³ª Åë½Å¿¡ ´ëÇØ ¸¹Àº °ÍµéÀ» ¾Ë°í ÀÖ´Ù´Â »ç½ÇÀº ¾Æ·¡ÀÇ ±Ûµé¿¡¼­ ¶Ç È®ÀÎÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. »ç½Ç ´©±¸ ³ª »ý°¢ÇÒ ¼ö ÀÖ´Â °Í µéÀÏÁöµµ ¸ð¸£°Ú½À´Ï´Ù. ´ÜÁö, ´©±º°¡ ¸ÕÀú ÀÌ·ÐÈ­ ÇßÀ» »Ó. =[¼Û¼ö½Å ¹æ½Ä¿¡ µû¸¥ ºÐ·ù] =================================================== -[³×Æ®¿÷ ÅäÇ÷ÎÁö]---------------------------------------------------------- ±â¾ïÀÌ È®½ÇÄ¡´Â ¾ÊÁö¸¸, ÅäÇ÷ÎÁö´Â ÁöÇüÇÐÀ» ¶æÇÑ´Ù°í µé¾ú´ø°Í °°½À´Ï´Ù. ¾îÂî µÇ¾úµç, Àß »ý°¢ÇØ º¸¸é ³×Æ®¿÷ÀÇ ±¸¼ºµµ¸¦ º¸¸é, ¸î¸î Ư¡ÀûÀÎ ¿¬°áµµ(ÁöÇüµµ)¸¦ ±×·Á³¾ ¼ö ÀÖ½À´Ï´Ù. °¢°¢ÀÇ ¹æ½Ä¿£ ÀåÁ¡ ¹× ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù¸¸ ¿Ü¿ì½Ç ÇÊ¿ä´Â ¾ø ½À´Ï´Ù. ^^; *¸µ ¸» ±×´ë·Î ¹ÝÁö¿Í °°Àº ±¸Á¶ÀÔ´Ï´Ù. ¿©·¯´ëÀÇ ÄÄÇ»ÅÍ°¡ ¼­·Î ÀÌ¿ôµÈ ÄÄÇ»ÅÍ¿Í ¼±·Î ¸¦ ÅëÇØ ¿¬°áµÇ¾î ÀÖ´Â ±¸Á¶ÀÔ´Ï´Ù. ÀåÁ¡Àº ¾î´À ¼±·Î Çϳª°¡ ²÷°åÀ» °æ¿ì¿¡ Åë½Å ¿¡´Â ¹®Á¦°¡ ¾ø´Ù´Â Á¡ÀÌÁÒ. ´ÜÁ¡Àº µ¥ÀÌÅÍ Çϳª¸¦ º¸³»±â À§ÇØ ¿©·¯ ÄÄÇ»Å͸¦ °Å Ä£´Ù´Â Á¡ ÀÌ°Ú±º¿ä. *½ºÅ¸ ¾î¶² Áß¾Ó ¼­¹ö ÇÑ´ë°¡ ÀÖ°í, ´Ü¸»±â ÇüÅÂÀÇ ÄÄÇ»Å͵éÀÌ ¼­¹ö¿¡ ¿¬°áµÇ¾î ÀÖ´Â °æ ¿ìÁÒ. ºÒ°¡»ç¸®¸¦ ¿¬»óÇϽøé ÁÁÀ»µí Çϱº¿ä. ÀÌ ÅäÇ÷ÎÁöÀÇ ´ÜÁ¡Àº Áß¾Ó Á¦¾î Àå Ä¡¿¡ ¹®Á¦°¡ »ý±â¸é ¸ðµç Å͹̳Π»çÀÌÀÇ ¿¬°áÀÌ ²÷¾îÁ® ¹ö¸°´Ù´Â Á¡ ÀÔ´Ï´Ù. ÇÏÁö ¸¸, Å͹̳ÎÀÌ ¸î ´ë°¡ °íÀ峪µç »ó°üÀº ¾ø°ÚÁÒ? ^^; *¹ö½º °í¼Óµµ·Î ÈÞ°Ô¼ÒA¿¡¼­ ÈÞ°Ô¼Ò B·Î ¹°°ÇÀ» ¹è´ÞÇÏ´Â ½Ã½ºÅÛÀ» »ý°¢ÇØ º¸½Ã´Â°Ô ÁÁ°Ú ±º¿ä. °í¼Óµµ·Î¿¡ ²÷±â´Â °÷¸¸ ¾ø´Ù¸é ¾î´À ÈÞ°Ô¼Òµç ¹°°ÇÀ» ¹è´ÞÇÒ ¼ö ÀÖ°ÚÁÒ? ¸¶ Âù°¡Áö·Î ¿©·¯´ëÀÇ ÄÄÇ»ÅÍ´Â ÇϳªÀÇ ¼±·Î¸¦ °øÀ¯ÇÏ°í ±× ¼±·Î¸¦ ÅëÇؼ­ ÀÚ½ÅÀÇ ¿ø ÇÏ´Â ÄÄÇ»ÅÍ·Î ¸Þ½ÃÁö¸¦ º¸³¾¼ö ÀÖ´Â ¹æ½ÄÀÔ´Ï´Ù. ÀÌ ¹æ½ÄÀÇ ¾àÁ¡Àº ¸ðµÎ°¡ °øÀ¯ÇÏ °í ÀÖ´Â ¼±·Î°¡ ÆÄ¼Õ µÇ¾úÀ»¶§ ¸ðµç ½Ã½ºÅÛÀÌ °í¸³µÈ´Ù´Â Á¡ÀÌÁÒ. ½ºÅ¸ ¹æ½Ä¿¡¼­ Áß¾Ó Á¦¾îÀåÄ¡°¡ °íÀ峪µíÀÌ¿ä. À§ÀÇ ±¸Á¶Áß ¾î¶² ¹æ½ÄÀÌ ÃÖ¼±À̶ó°í Á¤ÀǸ¦ ÇÒ ¼ö´Â ¾ø½À´Ï´Ù. ¿ª½Ã °¡Àå Áß¿äÇÑ Á¡Àº °¡°Ý´ë ¼º´Éºñ°ÚÁÒ. ÅõÀÚµÉ ¼±·Îºñ°¡ ÄÄÇ»Åͺ¸´Ù ½ÑÁö ¾Æ´ÑÁö¿¡ µû¶ó ¼±·ÎÀÇ ¾ÈÁ¤¼ºÀÌ Áß¿äÇÑÁö Á¦¾îÀåÄ¡(ÄÄÇ»ÅÍ)ÀÇ ¾ÈÁ¤¼ºÀÌ Áß¿äÇÑÁö¿¡ µû¶ó ¼±ÅÃÀ» ÇؾßÇÒ ¹®Á¦´Ï±î¿ä. =[³×Æ®¿÷ ÅäÇ÷ÎÁö] =========================================================== -[On Line / Off Line]-------------------------------------------------- ------ *On Line ¸» ±×´ë·Î ¼±ÀÌ ¿¬°áµÇ¾î ÀÖ´Â °æ¿ìÀÔ´Ï´Ù. ¿©·¯°¡Áö ¿¹°¡ ÀÖ°ÚÁÒ? ÀºÇà¿¡¼­ ´Ù¸¥ °÷À¸·Î µ·À» º¸³½´ÙµçÁö ÇÏÀÌÅÚ¿¡ Á¢¼ÓÇؼ­ µ¥ÀÌÅ͸¦ ´Ù¿î·Îµå¸¦ ¹Þ´Â°æ¿ì. ȤÀº ´ëÈ­ ¹æ¿¡¼­ äÆÃÀ» Çϴ°æ¿ì ÀüÈ­ µîµî...... ^^; À§ ¿¹µéÀÇ °øÅëÁ¡ÀÌÀÚ Off Line°úÀÇ Â÷ÀÌÁ¡Àº ¾î¶² ¼±·Î¸¦ ÅëÇØ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ ´Â ´Ù´Â Á¡ÀÔ´Ï´Ù. ÀåÁ¡Àº ¿ª½Ã Áï°¢ÀûÀÎ ´äÀ» ¾òÀ»¼ö ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù¸¸, ¼±·Î¸¦ ÅëÇØ º¸³¾¼ö ¾ø´Â °ÍµéÀÌ ´õ ¸¹´Ù´Â Á¡ÀÌ°ÚÁÒ. ^^; *Off Line ²÷¾îÁø ¼±. (-_-;) ¾î¶² ¼±·Î¸¦ ÅëÇÑ Åë½ÅÀÌ ¾Æ´Ñ °æ¿ì¸¦ »ý°¢ÇÏ½Ã¸é µÇ°ÚÁÒ? ÀÚ ÁÖ ÇϽÇÁö´Â ¸ð¸£°ÚÁö¸¸, ¿ÀÇÁ¶óÀÎ ¸ðÀÓÀ̶óµçÁö ¼ÒÆ÷¸¦ º¸³»´Â °æ¿ì°ÚÁÒ. ´ÜÁ¡Àº ¿Â¶óÀΰú ¹Ý´ë·Î Áï°¢ÀûÀÎ ´äÀ» ¾òÀ»¼ö ¾ø´Ù´Â Á¡ÀÌÁö¸¸, ¼±·Î¸¦ ÅëÇØ º¸³¾ ¼ö ¾ø ´Â µ¥ÀÌÅ͸¦ ÁÖ°í ¹ÞÀ» ¼ö ÀÖ´Ù´Â Á¡ÀÌ°ÚÁÒ. ¿Â¶óÀÎ ´ëÈ­¿¡¼­ ´À³¥¼ö ¾ø´Â »ç¶÷ÀÇ ´À³¦À̶ö±î¿ä? ^^; =[On Line / Off Line] ======================================================== -[ OSI 7 Layer ]------------------------------------------------------ ³×Æ®¿÷ »ó¿¡ ¿¬°áµÇ´Â ½Ã½ºÅÛÀÇ ÀÌ»óÀûÀΠǥÁØ ¸ðµ¨À» Á¤ÀÇÇÑ °èÃþÀÔ´Ï´Ù. °³³ä ÀÌ ÇØ°¡ Áß¿äÇÕ´Ï´Ù. ±í°Ô °øºÎÇÒ ÇÊ¿ä´Â ¾øÁö¸¸, 7°¡Áö °èÃþÀÇ °ü°è¿Í ½ÇÁ¦ ±× °èÃþ µéÀÌ ½ÇÁ¦ ¿©·¯ºÐµéÀÌ »ç¿ëÇϽô ÀÎÅͳݿ¡¼­ ¾î¶² ¿ªÇÒÀ» ÇÏ´ÂÁö´Â ²À ÆľÇÀ» ÇØ µÎ¼Å¾ß¸¸ ÇÕ´Ï´Ù. Á¦°¡ ¼³¸íÀ» ÇÏ·Á°í ÇßÁö¸¸, ¾î¼³Ç Á¦ ¼³¸íº¸´Ù´Â ¼­Á¡¿¡ ³Î·Á ÀÖ´Â ³×Æ®¿÷ Ã¥ Áß ¾Æ¹«°Å³ª ÇÑ ±Ç Àâ°í º¸½Ã¸é µÉ ºÎºÐÀ̱⿡ ¼³¸íÀº »ý·«ÇÕ´Ï´Ù. Âü°í·Î ´Ù º¸½Ã±â ±ÍÂúÀ¸½Ã¸é ¾Æ·¡ 4°¡Áö °èÃþÀ» ÁßÁ¡ÀûÀ¸·Î º¸½Ê½Ã¿ä. 1. ¹°¸® 2. ³×Æ®¿öÅ©/¸µÅ© 3. Àü¼Û 4. ¾ÖÇø®ÄÉÀ̼Ç. À§ÀÇ 4°¡Áö °èÃþÀ» ²À ¼÷ÁöÇÏ½Ã°í ´ÙÀ½ °Ô½Ã¹°À» Àоî Áֽñ⠹ٶø´Ï´Ù. =[ OSI 7 Layer ] ============================================================= -[ÀÎÅͳݿ¡¼­ µ¥ÀÌÅÍ´Â ¾î¶»°Ô Àü¼ÛµÉ±î?]--------------------------------- ¿ì¼± ¸î°¡Áö ¿ë¾î¿¡ ´ëÇÑ Á¤ÀǸ¦ ÇؾßÇÒ°Í °°½À´Ï´Ù. *IP : ³×Æ®¿÷ »ó¿¡¼­ÀÇ ÁÖ¼Ò. *Port : IP·Î µé¾î¿À´Â ÆÐŶÀ» ±¸ºÐÁö¾îÁÖ´Â ±¸ºÐÀÚ(?) *Packet : º¸³¾ µ¥ÀÌÅ͸¦ Àû´çÈ÷ À߶ó³õÀº Á¶°¢. Á»´õ ´Ù¼¼È÷º¸µµ·Ï ÇÏÁÒ. I P : ³×Æ®¿÷»ó¿¡¼­ÀÇ ÁÖ¼Ò¶ó°í »ý°¢ÇÏ½Ã¸é °£´ÜÇÕ´Ï´Ù. ´ç¿¬ÇÑ À̾߱âÁö¸¸, ÀüÈ­ ¸¦ ÇÏ·Á¸é ÀüÈ­¹øÈ£°¡ ÇÊ¿äÇÏ°í ¿ìÆí¹°À» º¸³»·Á¸é ÁÖ¼Ò°¡ ÇÊ¿äÇÕ´Ï´Ù. ÀÌ¿Í ¸¶Âù°¡Áö·Î ÄÄÇ»ÅÍ»çÀÌÀÇ Åë½Å¿¡¼­´Â IP¶ó´Â ÁÖ¼Ò°¡ »ç¿ëµË´Ï´Ù. ±× Çü½ÄÀº ¾Æ·¡¿Í °°½À´Ï´Ù. ex) 169.254.34.243 ( 0~255.0~255.0~255.0~255 ) Æ÷Æ® : ÁÖ¼Ò¸¸ ¾È´Ù°í ¹°°ÇÀ» ¿øÇÏ´Â »ç¶÷¿¡°Ô Á¤È®ÇÏ°Ô Àü´ÞÇÒ¼ö ÀÖÀ»±î¿ä? ±× ¹°°ÇÀ» ¹ÞÀ» »ç¶÷ÀÇ À̸§ÀÌ ÀÖ¾î¾ß Á¤È®È÷ Àü´ÞÀÌ µÉ°ÍÀÔ´Ï´Ù. ÁÖ¼Ò°¡ ¸Â ¾Æµµ À̻縦 °¬´Ù°Å³ª ¹Þ´Â »ç¶÷ÀÇ À̸§À» ¾ËÁö ¸øÇÏ¸é ¿ìÆí ¹è´ÞºÎ´Â ³­°¨ ÇÒ °ÍÀÔ´Ï´Ù. °°Àº IP·Î µ¥ÀÌÅ͵éÀÌ ¿Íµµ Æ÷Æ®¿¡ µû¶ó ±× µ¥ÀÌÅ͵éÀÌ ºÐ·ù µË´Ï´Ù. ÄÄÇ»ÅÍ·Î »ý°¢Çϸé ÄÄÇ»ÅÍ¿¡ µ¥ÀÌÅÍ°¡ ¼ö½ÅµÇ¾úÀ»¶§, ±× µ¥ÀÌÅÍ °¡ »ç¿ëµÉ ÇÁ·Î±×·¥À» ±¸ºÐ ÁöÀ» ±¸ºÐÀÚÁ¤µµ·Î »ý°¢ÇÏ½Ã¸é °£´ÜÇÒ °Ì´Ï´Ù. ex) 5001 ( 0~65535 ) ÆÐŶ : ÆÐŶÀº ¿ìÆí¹° Á¤µµ·Î »ý°¢ÇÏ½Ã¸é °£´ÜÇÕ´Ï´Ù. Áï, ½ÇÁ¦·Î º¸³¾ µ¥ÀÌÅͶó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù. ±× ³»¿ëÀº º¸³»´Â »ç¶÷ÀÇ ¸¶À½ÀÌ°ÚÁÒ? ^^; ¿ì¼± ÄÄÇ»ÅÍ¿¡ ´ëÇÑ ¼³¸íÀ» ÇϱâÀü¿¡ ¿ì¸® ÀÏ»óÀ» »ý°¢ÇØ º¼±î¿ä? AÁöÁ¡¿¡¼­ BÁö Á¡À¸·Î ¸¹Àº »ç¶÷ÀÌ À̵¿ÇÑ´Ù°í °¡Á¤À» Çغ¸ÁÒ. À̵¿ ¹æ¹ýÀº ÀÚµ¿Â÷, ±âÂ÷, ºñÇà±â , ¹è ÀÌ·¸°Ô 4°¡Áö°¡ ÀÖ´Ù°í »ý°¢À» ÇØ º¸ÁÒ. °°Àº ½Ã°£¿¡ °¡Àå ¸¹Àº »ç¶÷À» AÁöÁ¡ ¿¡¼­ BÁöÁ¡À¸·Î À̵¿½Ãų¼ö ÀÖ´Â ¹æ¹ýÀº 4°¡Áö ±³Åë¼ö´ÜÀ» ÀÌ¿ëÇÒ »ç¶÷ÀÇ ¼ö¸¦ Àû ´çÈ÷ ºÐ¹èÇÏ°í Àû´çÇÑ À̵¿ °æ·Î¸¦ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀÏ °Ì´Ï´Ù. ÀÎÅͳݿ¡¼­ µ¥ÀÌÅ͸¦ º¸³»´Â ¹æ¹ýµµ À§¿Í Å©°Ô ´Ù¸£Áö ¾Ê½À´Ï´Ù. AÁöÁ¡¿¡¼­ BÁöÁ¡À¸·Î µ¥ÀÌÅ͸¦ º¸³¾ ¶§ È¿À²ÀûÀÎ Àü¼ÛÀ» À§ÇØ ±× µ¥ÀÌÅ͸¦ Àû´çÇÑ ´ÜÀ§·Î ²÷°í Àû´çÇÑ °æ·Î¸¦ ÁöÁ¤ÇØ ÁÖ¸é µË´Ï´Ù. ±×·³ À§ÀÇ °æ¿ì¸¦ ¿ë¾î·Î Á¤¸®¸¦ Çغ¸°Ú½À´Ï´Ù. ¾Õ¿¡¼­ À̾߱â ÇÑ ºÎºÐ°ú Å©°Ô ´Ù¸¥ ºÎºÐÀº ¾øÁö¸¸, ¿ë¾î ÆľÇÀ» À§ÇØ ´Ù½Ã Çѹø ¾²°Ú½À´Ï´Ù. ¾î·ÁºÐ ÄÄÇ»ÅÍ(ÀÌÇÏ A)ÀÇ ¾î¶² µ¥ÀÌÅ͸¦ ´Ù¸¥ ÄÄÇ»ÅÍ(ÀÌÇÏ B)·Î º¸³½ ´Ù°í °¡Á¤À» ÇØ º¸ÁÒ. A¿¡¼­ µ¥ÀÌÅ͸¦ B·Î º¸³»±âÀ§ÇØ ¿ì¼±Àº µ¥ÀÌÅ͸¦ ¾Ë¸ÂÀº Å© ±â·Î Áï, ÆÐŶ ´ÜÀ§·Î ÀÚ¸¨´Ï´Ù. ±×¸®°í ±× ÆÐŶ¿¡´Â ÀÌ Ã£¾Æ°¡¾ß ÇÒ ÄÄÇ»ÅÍÀÇ ³× Æ®¿÷»óÀÇ ÁÖ¼Ò(IP)°¡ ÀÖ¾î¾ß°ÚÁÒ? ±×·±µ¥, IP°¡ ÁöÁ¤µÇ¾ú´Ù°í B¸¦ ã¾Æ°¥¶§ ¾Æ¹«·¸ °Ô³ª °¡Áö´Â ¾Ê°ÚÁÒ? ´ç¿¬È÷ °¡Àå ºü¸£°Ô °¥ ¼ö ÀÖ´Â ±æÀ» ã¾Æ³»¼­ ±× ±æ·Î °¡¾ß ÇÒ °ÍÀÔ´Ï´Ù. ¾îÂîµÇ¾úµç, º¸³»¿Â µ¥ÀÌÅÍ Áï, ÆÐŶÀÌ ´Ù ¸ð¾ÆÁö¸é, OK½ÅÈ£¸¦ º¸³» °í ±× µ¥ÀÌÅÍ´Â B¿¡¼­ ÀÎÁ¤ÀÌ µÇ´Â°ÅÁÒ. ±×·±µ¥, ¸¸¾à Åë½Å ÇÁ·Î±×·¥¿¡ IP¸¸ ÀÖ´Ù ¸é ÄÄÇ»ÅÍ Çϳª´ç Åë½Å ÇÁ·Î±×·¥Àº ´Ü Çϳª¹Û¿¡ Á¸ÀçÇÒ ¼ö ¾øÀ» °ÍÀÔ´Ï´Ù. ±×°É º¸ ¿ÏÇϱâ À§ÇÑ °³³äÀ» Æ÷Æ®¶ó°í »ý°¢À» ÇÏ½Ã¸é µË´Ï´Ù. ^^; Áï, IP·Î »ó´ë¹æÀÇ ÄÄÇ» ÅÍ ÁÖ¼Ò¸¦ Àû¾îÁÖ°í Æ÷Æ®·Î ¹ÞÀ» ÇÁ·Î±×·¥À» ÁöÁ¤ÇØÁÖ´Â °ÅÁÒ. =[ÀÎÅͳݿ¡¼­ µ¥ÀÌÅÍ´Â ¾î¶»°Ô Àü¼ÛµÉ±î?] ====================================== -[ÀÚ½ÅÀÇ IPÈ®ÀÎÇϱâ]-------------------------------------------------------- ´ç¿¬ÇÑ À̾߱âÁö¸¸ ³×Æ®¿÷ ÇÁ·Î±×·¥À» ÇÏ·Á¸é ±âº»ÀûÀ¸·Î Åë½Å ÀåÄ¡°¡ ÀÖ¾î¾ßÇÕ´Ï ´Ù. ¸ðµ©, ·£Ä«µå, µÎ·ç³ÝÀ̳ª µå¸²¶óÀΰ°Àº ¼­ºñ½º¿¡ °¡ÀÔµîÀÇ ¹æ¹ýÀ¸·Î ÀÚ½ÅÀÇ IP¸¦ ÇÒ´ç ¹Þ¾Æ¾ßÇÕ´Ï´Ù. ¸ðµ©ÀÇ °æ¿ì´Â ÀüÈ­Á¢¼Ó ³×Æ®¿öÅ·À¸·Î Åë½Å»ç¿¡ Á¢¼ÓÀ» ÇÏ°í IP¸¦ ¹è´ç¹Þ´Â ¹æ¹ýÀÌ ÀÖ°Ú°í, ·£Ä«µå´Â ÀåÂø¸¸ Çصµ °¡»óÀÇ IP¸¦ ¾òÀ»¼ö ÀÖ ½À´Ï´Ù. ¶ÇÇϳªÀÇ ¹æ¹ýÀº µÎ·ç³ÝÀ̳ª µå¸²¶óÀΰ°Àº Àü¿ë¼± ¾÷ü¿¡ °¡ÀÔÇؼ­ IP¸¦ ÇÒ´ç¹Þ´Â ¹æ¹ýÀÔ´Ï´Ù. ±×³É ·£Ä«µå¸¸ ÀÖÀ¸¸é °¡»óÀ¸·Î ¹Û¿¡ üũ°¡ ¾ÊµÇÁö¸¸ IP¸¦ ÇÒ´ç ¹ÞÀ¸¸é, ½ÇÁ¦·Î µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ¾Æ º¼¼ö ÀÖ½À´Ï´Ù¸¸ ·£Ä«µå¸¸À¸·Î °¡»óÀÇ Å× ½ºÆ®¸¦ ÇØ º¸´Â ¹æ¹ýµµ ³ª»ÚÁö´Â ¾Ê½À´Ï´Ù. Àúµµ óÀ½¿£ ±×·¸°Ô Çß¾ú½À´Ï´Ù. ±×·¡ ¼­ ¾Õ °Ô½Ã¹°¿¡¼­ ·£Ä«µå¸¦ ½Î±¸·Á¶óµµ Çϳª Á¤µµ´Â ²À ±¸ºñÇØ µÎ¶ó°í Çß¾úÁÒ. ³ëÆĽɿ¡¼­ ÇÏ´Â À̾߱âÁö¸¸, ¿î¿µÃ¼Á¦¿¡ µû¸¥ ¾Æ·¡ÀÇ Å×½ºÆ®¸¦ ²À ÇØÁֽʽÿä. ±×¸®°í ÀÚ½ÅÀÇ IP¸¦ È®ÀÎÇÏ´Â ¹ýÀ» ²À ãÀ¸½Ê½Ã¿ä. À©µµ¿ì 98°ú À©µµ¿ì 2KÀÇ °æ¿ì Á¶±Ý ´Ù¸¨´Ï´Ù. À©µµ¿ì98 : ½ÃÀÛ¹öÆ°À» ´©¸¥´Ù. ½ÇÇàÀ» ¼±ÅÃ. winipcfg¸¦ ÀÔ·ÂÈÄ ¿£ÅÍÇϽøé ÇÁ·Î±×·¥ÀÌ Çϳª ¶å´Ï´Ù. ¸ðµ©ÀÌ ÀÖÀ¸½ÅºÐÀº PPP Adapter°¡ ÀÖÀ»°Ì´Ï´Ù. ÀüÈ­Àü¼Ó ³×Æ®¿öÅ·À¸·Î ¿¬°áÀ» ÇϽŻóŸé ÇÒ´ç¹ÞÀº IP°¡ ³ª¿ÃÅ×°í, ¾Æ´Ï¸é ¾Ë¼ö ¾ø´Â ¼ýÀÚµé ÀÌ ³ª¿ÍÀÖ½À´Ï´Ù. ¸¸¾à ·£Ä«µå¸¸ ÀÖÀ¸½Ã¸é, PPP Adapter°¡ ¾ø°í ´ë½Å ·£Ä«µå¿Í °ü·ÃµÈ Á¤º¸°¡ º¸ÀÏ°Ì´Ï´Ù. ¸ðµ©°ú ·£Ä«µå°¡ °°ÀÌ ÀÖÀ¸½Ã¸é PPP AdapterÄÞº¸ ¹Ú½º¸¦ µå¶ø´Ù¿î ½ÃÄѺ¸½Ê½Ã¿ä. ³ª¿É´Ï´Ù. ±×¸®°í ¼± ÅÃÇϸé, IPÁ¤º¸¸¦ È®ÀÎÇÒ¼ö ÀÖ½À´Ï´Ù. ¶Ç ÇϳªÀÇ ¹æ¹ý. ±×³É µµ½ºÃ¢¿¡¼­ ipconfigÀÔ·ÂÀ» ³Ö½À´Ï´Ù. À©µµ¿ì2K : ½ÃÀÛ ¹öÆ°À» ´©¸¥´Ù. º¸Á¶ÇÁ·Î±×·¥ ¸í·É ÇÁ·ÒÇÁÆ® µµ½ºÃ¢¿¡¼­ ipconfig¶ó°í Ĩ´Ï´Ù. IP, Subnet Mask, Gateway°¡ ³ª¿É´Ï´Ù¸¸ ¿ì¸®°¡ ÇÊ¿äÇÑ °ÍÀº IP»Ó ·£Ä«µå¸¸ ´Þ¶û ´Þ¾Æ ³õÀ¸¼Ì´Ù¸é, ÀÚµ¿À¸·Î ÀâÈù IP°¡ º¸ÀÏ°Ì´Ï´Ù. ¸¸¾à IP¸¦ ÇÒ´ç ¹ÞÀ¸¼Ì´Ù¸é ÇÒ´çµÈ IP°¡ ³ª¿À°ÚÁÒ? ^^; Tip : ¾Æ¸¶µµ ·£Ä«µå¸¸À¸·Î °¡»óÀÇ ³×Æ®¿÷ ȯ°æÀ» ¸¸µé¾î ¾²½Ç ºÐµéÀÌ ¸¹À»°Ì´Ï´Ù. Çö½ÇÀûÀ¸·Î ¸ðµ©À¸·Î Çϱ⿣ ¹«¸®°í ±×·¸´Ù°í IP ¼­ºñ½º °¡ Àü¿ªÀ¸·Î ÆÛÁø »óÅ°¡ ¾Æ´Ï´Ï±î¿ä. ±×·²°æ¿ì¸é À©µµ¿ì 2K¿¡¼­ ·£Ä«µå¸¦ ¼³Ä¡ÇÏ°í ÇϽʽÿä. À©µµ¿ì 98Àº ½Ãµ¿µÉ¶§¸¶´Ù °¡»óÀÇ IPÁÖ¼Ò¸¦ °è¼Ó ¹Ù²ß´Ï´Ù. ³ªÁß¿¡ À̹®Á¦´Â ²Ï ±ÍÂú¾ÆÁý´Ï´Ù. ÇÏÁö¸¸ À©µµ¿ì 2K´Â ÀüÇô º¯ÇÔÀÌ ¾øÁ®. ÇÑ ¹ø ¼³Á¤µÈ °ªÀ» °è¼Ó À¯ÁöÇÕ´Ï´Ù. ÇÏÁö¸¸ À©µµ¿ì 98¿¡¼­µµ ÇØ°á¹ýÀº ÀÖ½À´Ï´Ù. ^^; ³×Æ®¿öÅ© ȯ°æ¿¡¼­ ¿À¸¥ÂÊ ¹öÆ°À» ´©¸£°í µî·ÏÁ¤º¸¸¦ ¼±ÅÃÇÕ´Ï´Ù. TCP/IP µî·Ï Á¤º¸¸¦ ¼±ÅÃÇÏ°í ±× ¾È¿¡¼­ IPÁ¤º¸¸¦ ¼±ÅÃÇÕ´Ï´Ù. ¿©±â¿¡ IP¸¦ ÀÚµ¿À¸ ·Î ÇÒ´çÇÔÀ̶ó´Â ¶óµð¿À¹öÆ°À» ÇØÁ¦ÇÏ°í IP¸¦ °­Á¦·Î ÁöÁ¤ÇØ ¹ö¸®´Â°Ì´Ï´Ù. ±×·¯¸é ±× IP·Î °è¼Ó À¯ÁöµË´Ï´Ù. =[ÀÚ½ÅÀÇ IPÈ®ÀÎÇϱâ] ========================================================= ¾²°íº¸´Ï Á¤¸» ³¯¸² ±âº» Á¤¸®±º¿ä. --; Á¦°¡ ³×Æ®¿÷ ÇÁ·Î±×·¥¿¡ óÀ½ Á¢ÇßÀ»¶§ °¡Àå ¾î·Á¿ü´ø Á¡ÀÌ ¿ë¾î ¹®Á¦¿´½À´Ï´Ù. ¾Ë°í º¸¸é º°°Íµµ ¾Æ´Ï¾ú´Âµ¥, óÀ½¿¡ ÇÏ ³ª Çϳª ÀÌÇظ¦ ÇØ ³ª°¡´Âµ¥, ¿ë¾îÇϳª¸¦ ¸ð¸£¸é ÀÌ»¡ÀÌ Çϳª ºüÁ®¹ö¸° ´À³¦À̾ú½À ´Ï´Ù. À§ÀÇ ³»¿ëµéÀ» »À´ë(ºÎ½ÇÇÑ ^^)·Î ¼­Á¡¿¡¼­ Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾ò¾î ³õÀ¸ ½ÅÈÄ¿¡ ´ÙÀ½ Àý·Î ³Ñ¾î °¡½ÉÀÌ ÁÁÀ» µíÇÕ´Ï´Ù. À©µµ¿ì ¼ÒÄÏ ÇÁ·Î±×·¥¸¸À» Çϴµ¥´Â OSI 7 Layer°°Àº°Ô ½ÇÁ¦·Î Áß¿äÇÏÁö´Â ¾ÊÁö¸¸ ¾Ë°í ÀÖÀ»°æ¿ì¿Í ±×·¸Áö ¾ÊÀ» °æ¿ì »ó´çÇÑ Â÷ÀÌ°¡ ÀÖ½À´Ï´Ù. °³ÀÎÀûÀ¸·Î ±× °æÇèÀ» Çغñ⿡ ¿©·¯ºÐµé²² °¨È÷ ÇϽöó °í Áö¼ÓÀûÀ¸·Î À̾߱⸦ ÇÏ°í ÀÖ½À´Ï´Ù. ^^; [ÁÖÀÇ] ´Ù½Ã ÇϹø °­Á¶ÇÏÁö¸¸ OSI 7 Layer, IP, Æ÷Æ®, ÆÐŶÀº ²À ÀÌÇظ¦ ÇØ ÁּŠ¾ßÇÕ´Ï´Ù. ±×¸®°í IPÈ®Àεµ ²À Çغ¸¼¼¿ä. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #02 ÁöÀºÀÌ : Á¤ÇöÈ£ * À̹ø °Ô½Ã¹°¿¡¼± ¾ÕÀ¸·Î ¿©·¯ºÐµé°ú ´Ù·ç°Ô µÉ À©µµ¿ì ¼ÒÄÏ¿¡ ´ëÇØ ¼³¸íÀ» ÇÏ°Ú ½À´Ï´Ù. ¾ÕÀ¸·Î °¡Àå ÀÚÁÖ ¾²ÀÌ°Ô µÉ °³³äÀ̹ǷΠȮ½ÇÇÏ°Ô ÀÌÇظ¦ ÇØ µÎ¼­¾ß ÇÕ ´Ï´Ù. [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] [À©µµ¿ì ¼ÒÄÏÀÌ ¹¹±æ·¡?] [ÆÄÀÏ Æ÷ÀÎÅ͸¦ ¸ÕÀú ºÁ¿ä.] [À©µµ¿ì ¼ÒÄÏ°ú ÆÄÀÏ Æ÷ÀÎÅÍÀÇ °ü°è´Â?] 2.À©µµ¿ì ¼ÒÄÏÀ̶õ? [À©µµ¿ì ¼ÒÄÏÀÌ ¹¹±æ·¡?] ¾ÕÀ¸·Î ¿©·¯ºÐ°ú Á¦°¡ °¡Àå ÀÚÁÖ ´Ù·ç°Ô µÉ ¹°°Ç(?)ÀÎ ¼ÒÄÏÀº ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÇÕ ´Ï´Ù. SOCKET MySocket; °£´ÜÇÏÁÒ? ±×·³ SOCKETÀÌ ¾îµð¿¡ ¾î¶»°Ô ¼±¾ðÀÌ µÇ¾îÀÖ´ÂÁö È®ÀÎÇØ º¸µµ·ÏÇÏÁÒ. ÄÄÆÄÀÏ·¯(VC++ ±âÁØ)ÀÇ ÀÎŬ·çµå Æú´õÀÇ WinSock.h¸¦ º¸½Ã¸é 35¹ø° ÁÙ¿¡ ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÀÌ µÇ¾î ÀÖ½À´Ï´Ù. typedef u_int SOCKET; ÇѸ¶µð·Î "unsigned int"¿´´ø °ÍÀ̾ú½À´Ï´Ù. ^^; À©µµ¿ì °è¿­ ³×Æ®¿÷ ÇùÖÀÇ ÇÙ½É ÀÎ À©µµ¿ì ¼ÒÄÏÀ̶ó´Â°Ô unsigned int¶ó´Ï Á¶±ÝÀº ½Ç¸ÁÇÑ ºÐµéÀÌ ¸¹À»µí Çϱº¿©. Àúµµ óÀ½¿£ ¹«½¼ ´ë´ÜÇÑ ±¸Á¶Ã¼ÀÎÁÙ ¾Ë¾Ò´Âµ¥, ¸·»ó ã¾Æº¸´Ï Àú ¸ð¾çÀÌ´õ±º¿ä. [ÆÄÀÏ Æ÷ÀÎÅ͸¦ ¸ÕÀú ºÁ¿ä.] À©µµ¿ì ¼ÒÄÏÀ» º¸±âÀü¿¡ ÆÄÀÏ Æ÷ÀÎÅ͸¦ »ý°¢ÇØ º¸µµ·ÏÇÏÁÒ. ÆÄÀÏÀ» Á¦¾îÇϱâ À§ÇØ ÆÄÀÏ Æ÷ÀÎÅÍ »ç¿ëÇϼ̴ø ±â¾ïÀ» µÇ»ì·Á º¸µµ·Ï ÇÏÁÒ. FILE *file; file = fopen( "MyText.Txt", "rb" ); fread( &Val, size, count, file ); . . . fwrite( &Val, size, count, file ); fclose( file ); º¸Åë À§¿Í °°ÀÌ Çß¾úÁÒ? Àú¸¸ À§¿Í°°ÀÌ Çß³ª¿ä? ¾îÂîµÇ¾úµç, fopenÀ̶ó´Â ÇÔ¼ö¸¦ ÅëÇØ fileÀ̶ó´Â Æ÷ÀÎÅÍ´Â MyText.txt¶ó´Â ÆÄÀÏÀ» ´ëÇ¥ÇÏ´Â ID°¡ µÇ¾ú½À´Ï´Ù. ±× µÚ¿¡ ÆÄÀÏ¿¡¼­ µ¥ÀÌÅ͸¦ Àо´ÙµçÁö, ÆÄÀÏ·Î µ¥ÀÌÅ͸¦ ±â·ÏÇÑ´ÙµçÁö ÇÒ ¶§, Ç×»ó fileÀ̶ó´Â ID¸¦ ÀÌ¿ëÇÏÁÒ. ÆÄÀÏÀ» ´Ù »ç¿ëÇßÀ¸¸é, fclose¶ó´Â ÇÔ¼ö·Î fileÀ̶ó´Â ID´Â ´õÀÌ»ó ¾²Áö ¾Ê°Ú´Ù°í ¾Ë·ÁÁÝ´Ï´Ù. ¿Ö °©ÀÚ±â ÆÄÀÏ Æ÷ÀÎÅ͸¦ À̾߱â Ç߳ĸé? ¾ÕÀ¸·Î ¿©·¯ºÐ²²¼­ »ç¿ëÇÏ½Ç À©µµ¿ì ¼ÒÄÏÀÌ À§ÀÇ ¿¹¿¡¼­ ´Ù·é file Æ÷ÀÎÅÍ¿Í ¾ÆÁÖ ºñ½ÁÇÏ°Ô »ç¿ëµÇ±â ¶§¹®ÀÔ´Ï´Ù. ´ÙÀ½ °Ô½Ã¹°¿¡¼­ ±¸Ã¼ÀûÀ¸·Î ¾î¶»°Ô ´Ù·êÁö¸¦ ÀÌ¾ß ±â ÇÏ°Ú½À´Ï´Ù. ÇöÀç °Ô½Ã¹°¿¡¼­´Â À§¿¡ Á¦°¡ À̾߱âÇÑ Á¤µµ¸¸ ¾Æ½Ã¸é ÃæºÐÇϸ®¶ó »ý°¢ÇÕ´Ï´Ù. [À©µµ¿ì ¼ÒÄÏ°ú ÆÄÀÏ Æ÷ÀÎÅÍÀÇ °ü°è´Â?] ¾Æ·¡¿¡ ½ÇÁ¦·Î ¼ÒÄÏÀÌ ¾î¶»°Ô ¾²ÀÌ´ÂÁö ¿¹¸¦ º¸ÀÌ°Ú½À´Ï´Ù. À§ÀÇ ÆÄÀÏ Æ÷ÀÎÅÍ »ç¿ë °ú ¾î¶²Á¡ÀÌ ºñ½ÁÇÑÁö À¯½ÉÈ÷ »ìÆì º¸½Ê½Ã¿ä. óÀ½º¸´Â ÇÔ¼öµéÀÇ ±â´É¿¡ ´ëÇؼ­´Â ¸ô¶óµµ µË´Ï´Ù. ¹Ù·Î ´ÙÀ½ °Ô½Ã¹°¿¡¼­ ÀÚ¼¼È÷ À̾߱âÇÏ°Ú½À´Ï´Ù. Áö±ÝÀº ¹®Àå Çü½Ä ¿¡¸¸ °ü½ÉÀ» °¡Áö°í º¸½Ê½Ã¿ä. SOCKETÀÌ ¾î¶»°Ô ¾²ÀÌ´ÂÁö...... ^^; //¼ÒÄÏÀÇ ¿ªÇÒÀº?------------------------------------------------------------ SOCKET ServerSocket; //¼­¹ö¼ÒÄÏ SOCKADDR_IN ServerAddress; //ÁÖ¼Ò¿¡ °ü·ÃµÈ ±¸Á¶Ã¼ ServerAddress.sin_family = AF_INET; ServerAddress.sin_addr.s_addr = INADDR_ANY; ServerAddress.sin_port = htons( ServerPort=5001 ); //¼ÒÄÏÀ» »ý¼ºÇÕ´Ï´Ù. ÆÄÀÏ Æ÷ÀÎÅÍÀÇ FILE *file°ú ºñ½ÁÇÕ´Ï´Ù. ServerSocket = socket(AF_INET, SOCK_STREAM,0); //ÆÄÀÏ Æ÷ÀÎÅÍ·Î ¾î¶² ÆÄÀÏÀ» ÁöÁ¤ÇÏ´Â ºÎºÐ°ú ºñ½ÁÇÕ´Ï´Ù. fopen()°ú ºñ½ÁÇÑ //±â´ÉÀ» ÇÕ´Ï´Ù. bind(ServerSocket,(struct sockaddr*)&ServerAddress,sizeof (ServerAddress)); listen(ServerSocket,SOMAXCONN); //fwrite³ª fread¿Í ºñ½ÁÇÏ°Ô ½ÇÁ¦·Î ¿øÇÏ´Â ÀÛ¾÷À» °¡´ÉÇÏ°Ô ÇØ ÁÖ´Â ÇÔ¼öµé. send( ServerSocket, SendMessage, SendSize, 0 ); . . . //¼ÒÄÏÀ» ´Ù ¾²¸é ´Ý½À´Ï´Ù. fclose()¿Í ºñ½ÁÇÕ´Ï´Ù. closesocket( ServerSocket ); //¼ÒÄÏÀÇ ¿ªÇÒÀº? ============================================================= ³ª¸§´ë·Î ÆÄÀÏ Æ÷ÀÎÅÍ¿Í ºñ½ÁÇÏ´Ù°í ¾ïÁö·Î ¸»ÇÏ°í ¾ïÁö·Î ³¢À§¸ÂÃá ºÎºÐµµ ¾øÁö ¾Ê¾Æ ÀÖ±â´Â ÇÕ´Ï´Ù¸¸, ÆÄÀÏÀ» ´Ù·ï º¸¼Ì´Ù¸é, À§ÀÇ ¿¹°¡ ¿ÀÈ÷·Á ½±°Ô ¿ÀÁö ¾ÊÀ»±î »ý°¢ÇÕ´Ï´Ù. Àúµµ óÀ½¿¡ À§ÀÇ ¿¹¸¦ µé¾î ¼³¸íÀ» µé¾úÀ»¶§ ½±°Ô ´À²¸Áøµí ÇÏ°í¿ä. ´ÙÀ½ °Ô½Ã¹°ºÎÅÍ´Â ½ÇÁ¦·Î À©µµ¿ì ¼ÒÄÏÀ» ÃʱâÈ­ Çغ¸°Ú½À´Ï´Ù. À̹ø °Ô½Ã¹°¿¡¼­ Ưº°È÷ ÁÖÀÇÇÒ »çÇ×Àº ¾ø½À´Ï´Ù. ´ÜÁö, À©µµ¿ì ¼ÒÄÏÀÌ ¾î¶² ÇüÅ °í ½ÇÁ¦ ¹®¹ý¿¡¼­ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö¿¡ ´ëÇØ ÇÑ ¹ø Äf¾î º¸½Ã´Â Á¤µµ¸é µË´Ï´Ù. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #03 ÁöÀºÀÌ : Á¤ÇöÈ£ //////////////////////////////////////////////////////////////////////////// // Á¦ ±ÛµéÀº Àý´ë·Î »ó¾÷Àû ¸ñÀûÀ¸·Î »ç¿ëµÉ¼ö ¾øÀ¸¸ç, ÀúÀÚÀÎ ÀúÀÇ Çã¶ô¾ø // // ÀÌ´Â ±× ¾î´À°÷¿¡µµ °Ô½Ã¸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù. // ////////////////////////////////////////////////////////////////////////////* ±âŸ ±Ã±ÝÇÑ »çÇ×Àº ¾Æ·¡·Î ¹®ÀǸ¦ ¹Ù¶ø´Ï´Ù. ashulam@hitel.net ashulam@isoft.co.kr *À©µµ¿ì ¼ÒÄÏÀÇ ÇÙ½ÉÀ̶ó ÇÒ ¼ö ÀÖ´Â ¼ÒÄÏ ÃʱâÈ­ ºÎºÐ¿¡ ´ëÇؼ­ ´Ù·ç°Ô µË´Ï´Ù. ºñÁ־󾾸¦ °¡Áö½ÅºÐÀº MSDNÀ» ÂüÁ¶ÇϽðí À©¼Ó Ã¥À» °¡Áö½ÅºÐÀº Ã¥À» Âü°í ÇϼŠ¼­ °¢ ÇÔ¼öµéÀÇ ¿ªÇÒÀ» ºÐ¸íÈ÷ ÀÌÇØÇØ µÎ¼Å¾ß¸¸ ÇÕ´Ï´Ù. C¾ð¾îÀÇ ¹®¹ýÀ» ¹è¿ì´Â ºÎºÐ °ú ºñ½ÁÇÏ°í Áß¿äµµµµ ±×¿Í ºñ½ÁÇÕ´Ï´Ù. ^^; ¿Ü¿ö¾ß ÇÏ´Â ºÎºÐµµ ¸¹°í Å×½ºÆ®ÇØ º¼ ºÎºÐµµ ¸¹±â¿¡ ¿©·¯ºÐÀ̳ª Àú³ª ´Ù ÁöÄ¡°Ú ±º¿ä. ^^; [¿¹Á¦ÄÚµå ÇÁ·ÎÁ§Æ® ±¸¼º ¹× »ç¿ë¹ý] ÀÌ °Ô½Ã¹°¿¡ °üÇÑ ¿¹Á¦´Â Network\TCP\Server¿¡ ÀÖ½À´Ï´Ù. ÇÁ·ÎÁ§Æ®¿¡ ws2_32.lib wsock32.lib ÆÄÀÏÀ» ÀçÁ¤ÀÇ ÇϼžßÇÕ´Ï´Ù. »ç¿ë¹ý] server ¼­¹öÇÁ·Î±×·¥ÀÇIPÁÖ¼Ò ¼­¹öÇÁ·Î±×·¥ÀÇÆ÷Æ®¹øÈ£(2000-65535±îÁö) ½ÇÇàÇÏ½Ã¸é ¾îµò°¡¿¡¼­ÀÇ ¿¬°áÀ» ±â´Ù¸°´Ù´Â ¸Þ½ÃÁö¸¸À» Ãâ·ÂÇÕ´Ï´Ù. ´ÙÀ½ °Ô½Ã¹° ¿¡¼­ ´Ù·ê Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥À» ½ÇÇàÇÏ½Ã¸é ¿¬°áÀ» ¹Þ°í ÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù. ¸¸ÀÏ ÀÚ½ÅÀÇ IP°¡ 111.222.111.222¶ó¸é? server 111.222.111.222 5001 client 111.222.111.222 5001 [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *WS2_32.DLLÀ» ÃʱâÈ­ÇØ¿ä~ *À©µµ¿ì ¼ÒÄÏÀ» ¸¸µé¾î ºÁ¿ä *¹ÙÀε尡 ¹»±î?? *´©±º°¡ÀÇ ¿¬°áÀ» ±â´Ù·Á ºÁ¿ä. *µ¥ÀÌÅ͸¦ º¸³»ºÁ¿ä~~ 3. À©µµ¿ì ¼ÒÄÏ ÃʱâÈ­¿Í ¼­¹ö ÇÁ·Î±×·¥ À̹ø °Ô½Ã¹°Àº ¼­¹ö ÇÁ·Î±×·¥¿¡ °üÇÑ À̾߱âÀÔ´Ï´Ù. ¸»ÀÌ °ÅâÇϱº¿ä. ^^; º¸ÅëÀÇ °æ¿ì Åë½Å½Ã ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®·Î ±¸¼ºÀÌ µË´Ï´Ù. À̹ø °Ô½Ã¹°Àº ¼­¹ö¸¦ ±¸µ¿Çϱâ À§ÇØ ¾î¶²½ÄÀ¸·Î À©µµ¿ì ¼ÒÄÏÀ» ÃʱâÈ­ÇÏ°í ³ª¿­ÇÏ´ÂÁö º¸°ÔµÉ °ÍÀÔ´Ï´Ù. ´ç¿¬È÷ ´ÙÀ½ °Ô½Ã¹°Àº Ŭ¶óÀ̾ðÆ®°ÚÁÒ. ^^; À̹ø °Ô½Ã¹°ÀÌ ¾Æ¸¶ Àüü °Ô½Ã¹°Áß ÃÖ°íÀÇ Áß ¿äµµ¸¦ ÀÚ¶ûÇÑ´Ù°í Çصµ °ú¾ðÀÌ ¾Æ´Ò°Ì´Ï´Ù. Çϳª Çϳª Àúµµ ¾Æ´Â°É ¸ðµÎ ¼³¸íÇÒÅ× ´Ï ²À ²À Çѹø¾¿ ŸÀÌÇÎÇØ º¸½Ã°í ÄÄÆÄÀϵµ ÇØ º¸½Ã°í ÀÌ»óÇÏ´Ù ½ÍÀº°Ç ÇϳªÇϳª ²À °Çµé¿© º¸½Ê½Ã¿ä. Á¤¸» Áß¿äÇÕ´Ï´Ù. Âü!! ÄÄÆÄÀÏÀ̳ª ¼Ò½º¿¡ °üÇÑ Á¦¾î´Â ´ÙÀ½ °Ô½Ã¹°±îÁö ÀÐÀ¸½ÅÈÄ ÃʱâÈ­¿¡ °ü·ÃµÈ ÇÔ¼ö¸¦ Àß º¸½Ã°í ³ª¼­ º¸½Ã´Â°Ô ÁÁÀ»°Ì´Ï´Ù . ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ÀüüÀûÀÎ °³³ä°ú µÎ ÇÁ·Î±×·¥ÀÇ °øÅëÁ¡°ú Â÷ÀÌÁ¡À» È®ÀÎÇØ º¸´Â °Ô Áß¿äÇÕ´Ï´Ù. [WS2_32.DLLÀ» ÃʱâÈ­ÇØ¿ä~] À©µµ¿ì ¼ÒÄÏÀ» ½ÃÀÛÇϱâ Àü¿¡ À©µµ¿ì¿¡¼­ À©µµ¿ì ¼ÒÄÏ°ú °ü·ÃµÈ DDLÆÄÀÏÀ» ÃʱâÈ­ ÇØ ÁÖ¾î¾ßÇÕ´Ï´Ù. MSDN¿¡ µû¸£¸é WS2_32.DLL¸¦ ÃʱâÈ­ ÇÑ´Ù°í ÇÏ´õ±º¿ä. ±× °úÁ¤ Àº ¾Æ·¡¿Í °°½À´Ï´Ù. °ÅÀÇ ¾Æ·¡ÀÇ °æ¿ì¸¦ ¹þ¾î³ª´Â ÀÏÀº ¾øÀ»°Ì´Ï´Ù. DLL¿¡ °üÇÑ ¼³¸íÀ» °çµéÀδÙ. //WSAStartup()»ç¿ëÇϱâ.----------------------------------------------------- WSADATA wsaData; if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { printf( "WSAStartup¼³Á¤¿¡¼­ ¹®Á¦ ¹ß»ý.\n" ); } ¼ÒÄÏ¿¡ °ü·ÃµÈ ÇÔ¼öµéÀ» Àß »ç¿ëÇÕ´Ï´Ù. WSACleanup(); //WSAStartup()»ç¿ëÇÏ ±â.====================================================== À©µµ¿ì ¼ÒÄÏÀ» »ç¿ëÇϽñâ À§ÇØ À§¿Í°°Àº °úÁ¤À» °ÅĨ´Ï´Ù. WSAStartupÀº WS2_32.DLLÀ» ÃʱâÈ­ ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. WSAStartup( ¹öÀü, WSADATA±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ ); ¹öÀü : º¸Åë 0x202¸¦ ¾¹´Ï´Ù. °ÅÀÇ µðÆúÆ®ÁÒ. ¹öÀü¿¡ °üÇÑ ÀÎÀÚÀÔ´Ï´Ù. WSADATAÀÇ ±¸Á¶´Â ¾Æ·¡¿Í °°½À´Ï´Ù. typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA, FAR * LPWSADATA; WSACleanupÀº WS2_32.DLLÀÇ »ç¿ëÀ» ³¡³»°Ú´Ù°í ¾Ë¸®´Â ÇÔ¼öÀÔ´Ï´Ù. int WSACleanup( void ); wVersion : ¹öÀüÀÔ´Ï´Ù. wHighVersion : ¹öÀüÀÔ´Ï´Ù. º¸ÅëÀº wVersion°ú °°Àº °ªÀ» °®½À´Ï´Ù. szDescription[WSADESCRIPTION_LEN+1] : ÇöÀç ¼ÒÄÏ¿¡ ´ëÇÑ ¼³¸íÀÔ´Ï´Ù. szSystemStatus[WSASYS_STATUS_LEN+1] : ÇöÀç »óŸ¦ ³ªÅ¸³À´Ï´Ù. unsigned short iMaxSockets : ³ªÁß¿¡ ä¿öÁö´Â °ªÀÔ´Ï´Ù¸¸ 2.0ÀÌÈÄ¿¡´Â ¹«½ÃµÇ´Â °ªÀ¸·Î ¾Ë°í ÀÖ½À´Ï´Ù. unsigned short iMaxUdpDg : 2.0À̻󿡼­´Â »ç¿ëµÇÁö ¾Ê½À´Ï´Ù. char FAR * lpVendorInfo: 2.0À̻󿡼­´Â »ç¿ëµÇÁö ¾Ê½À´Ï´Ù¸¸, 1.1 ¹öÀü¿¡¼­´Â »ç¿ëµË´Ï´Ù. ¾îµð¿¡ ¾²ÀÌ´ÂÁö ´Â Àúµµ ¸ð¸¨´Ï´Ù. ^^; ½ÇÁ¦·Î »Ì¾Æº¼ °ªÀº wVersionÁ¤µµÀÔ´Ï´Ù. ^^; °á°ú´Â ¾Æ·¡¿¡..... ^^; Version:202 :¹öÀü HighVersion:202 :¹öÀü Description:WinSock 2.0 :¹öÀüÀ» ¹®ÀÚ¿­·Î »ÌÀ». -_-; SystemStatus:Running :ÇöÀç À©µµ¿ì ¼ÒÄÏÀÇ »óŸ¦ ³ªÅ¸³¿. MaxSocket:0 :2.0À̻󿡴 ¼³Á¤½Ã ¹«½ÃµÇ´Â °ª. -_-; MaxUdpDg:0 :1.1¿¡¼­¸¸ ¾²Àδٴµ¥ ¾îµð¿¡ ¾²´ÂÁö Àúµµ ¸ð¸¨´Ï´Ù. [À©µµ¿ì ¼ÒÄÏÀ» ¸¸µé¾î ºÁ¿ä] º¸Åë »ç¿ë¹ýÀº ¾Æ·¡¿Í °°½À´Ï´Ù. //À©µµ¿ì ¼ÒÄÏÀ» ¸¸µé¾î ºÁ¿ä~------------------------------------------------ WSADATA wsaData; SOCKET ServerSocket; //¼ÒÄÏÀ» ¼±¾ðÇÕ´Ï´Ù. SOCKADDR_IN ServerAddress; //¼ÒÄÏÀÇ ÁÖ¼Ò Á¤º¸¸¦ ³Ö´Â ±¸Á¶Ã¼ÀÔ´Ï´Ù. unsigned short ServerPort = 5001; if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) printf( "WSAStartup¼³Á¤¿¡¼­ ¹®Á¦ ¹ß»ý.\n" ); ServerAddress.sin_family = AF_INET; //¹Ýµå½Ã AF_INETÀ̾î¾ßÇÕ´Ï´Ù. //IPÁÖ¼Ò°ª. INADDR_ANY´Â ¾Æ¹«°Å³ªÀÔ´Ï´Ù. ^^; ServerAddress.sin_addr.s_addr = inet_addr( "210.106.224.142" ); ServerAddress.sin_port = htons( ServerPort ); //Æ÷Æ®¹øÈ£ //¼ÒÄÏÀ» ¸¸µì´Ï´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº ¾Æ·¡¿¡...... ServerSocket = socket(AF_INET, SOCK_STREAM,0); // if( ServerSocket == INVALID_SOCKET ) //¿¡·¯ ¹ß»ý½Ã ¹®±¸ Ãâ·Â. { printf( "¼ÒÄÏÀ» »ý¼ºÇÒ¼ö ¾ø½À´Ï´Ù." ); } À©µµ¿ì ¼ÒÄÏ °ü·Ã ÇÔ¼öµéÀ» Àß ¾¹´Ï´Ù. ^^; closesocket( ServerSocket ); //¼ÒÄÏÀ» ´Ý½À´Ï´Ù. WSACleanup(); //À©µµ¿ì ¼ÒÄÏÀ» ¸¸µé¾î ºÁ¿ä ~================================================= SOCKADDR_INÀÇ ±¸Á¶´Â ¾Æ·¡¿Í °°½À´Ï´Ù. struct sockaddr_in { short sin_family; //AF_INETÀ̾î¾ß¸¸ ÇÕ´Ï´Ù. unsigned short sin_port; //Æ÷Æ® ¹øÈ£ struct in_addr sin_addr; //IPÁÖ¼Ò EX) "169.254.34.243" char sin_zero[8];//SOCKADDR°ú ġȯÇÒ¶§ °°Àº »çÀÌÁ ¸¸µé±â //À§ÇØ 8¹ÙÀÌÆ®ÀÇ °ø¶õÀÌ ÀÖ½À´Ï´Ù. ¹«ÀǹÌ. }; socket()Àº ¼ÒÄÏÀ» ÃʱâÈ­ ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ´ç¿¬ÇÑ°¡¿ä? ^^; SOCKET socket ( int af, int type, int protocol ); af : ÁÖ¼Ò °è¿­¿¡ ´ëÇÑ ±â¼ú. °ÅÀÇ AF_INETÀÌ µðÆúÆ® type : ¾Æ·¡¿¡ ±¸ °ªÁß Çϳª°¡ µé¾î°©´Ï´Ù. SOCK_STREAM : TCPÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÒ¶§ ¾¹´Ï´Ù. ¾çÂÊÀÌ È®½ÇÇÑ ¿¬ °áÀ» ÇØ ³õ°í ¾²´Â ¹æ½ÄÀÔ´Ï´Ù. ÀüÈ­¿Í ºñ½ÁÇÏÁÒ. SOCK_DGRAM : UDPÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÒ¶§ ¾¹´Ï´Ù. ƯÁ¤ÇÑ ¿¬°á ¾øÀÌ ±×³É º¸ ³»´Â °Ì´Ï´Ù. ¿ìÆí¹°À» º¸³»´Â ¹æ½Ä°ú ºñ½ÁÇÕ´Ï´Ù. protocol : º¸Åë 0À» ³Ö½À´Ï´Ù. Àúµµ Àǹ̴ ¸ð¸¨´Ï´Ù. ^^; closesocket()Àº ƯÁ¤ÇÑ ¼ÒÄÏÀ» ´Ý´Â ±â´ÉÀ» ÇÕ´Ï´Ù. int closesocket( SOCKET s ); [¹ÙÀε尡 ¹»±î??] ¹ÙÀεå´Â À§¿¡¼­ ÁöÁ¤ÇÑ IP¹øÈ£¿Í Æ÷Æ®¸¦ ¼ÒÄÏ°ú ¿¬°á Áö¾îÁÖ´Â °úÁ¤À̶ó°í »ý°¢ÇÏ ½Ã¸é µË´Ï´Ù. ÆÄÀÏ Æ÷ÀÎÅ͸¦ »ý°¢ÇØ º¸½Ã¸é ½¬¿ïµí Çϱº¿ä. file = fopen( "ÆÄÀÏÀ̸§", "¿É¼Ç" ); ÀÌ·¸°Ô ¼±¾ðÇϸé fileÀº ¾î¶² ÆÄÀÏ°ú ±×¿¡ ´ëÇÑ Á¢±Ù ¹æ½ÄÀ» ¾Ë·ÁÁÝ´Ï´Ù. ¹ÙÀε嵵 ¸¶Âù°¡Áö ÀÔ´Ï´Ù. ½ÇÁ¦ ¿¹¸¦ º¸ÁÒ. if( bind(ServerSocket,(struct sockaddr*)&ServerAddress,sizeof (ServerAddress) ) == SOCKET_ERROR ) printf( "bind() failed with error %d\n",WSAGetLastError() ); ServerAddress´Â ¾Õ¿¡¼­ ¼±¾ðÇÑ ³»¿ë°ú °°´Ù°í °¡Á¤ÇÕ´Ï´Ù. Áï, IP´Â 169.254.34.243ÀÌ°í, Æ÷Æ®¹øÈ£´Â 5001ÀÔ´Ï´Ù. ¹ÙÀÎÈÄ ¾ÕÀ¸·Î ServerSocke tÀº ÄÄÇ»ÅÍÀÇ "169.254.34.243"¹ø IPÀÇ 5001Æ÷Æ®¸¦ ³ªÅ¸³»´Â°Í°ú °°½À´Ï´Ù. ´Ù½Ã °­Á¶ÇÏÁö¸¸, ÆÄÀÏ ¿­¶§¸¦ Àß »ý°¢ÇØ º¸¼¼¿ä. °ÅÀÇ ºñ½ÁÇÕ´Ï´Ù. ^^; [ListenÀ¸·Î µé¾î ºÁ¿ä -_-;] ¼­¹öÀÇ °æ¿ì ¿¬°áÀ» ¹Þ¾ÆµéÀÌ´Â °æ¿ì°¡ ¸¹½À´Ï´Ù. ¿¬°á ½ÅÈ£°¡ µ¿½Ã¿¡ ¸¹ÀÌ ¿ÔÀ»¶§ ´Â ƯÁ¤ ¹öÆÛ¿¡ ÀúÀåÀ» ÇØµÎ°í ¿¬°áÀ» ÇØ Áà¾ß ÇÏ´Â °æ¿ì°¡ »ý±â°Ô ¸¶·ÃÀÌÁÒ. ¼ÒÄÏ ¿¡ ±× ¹öÆÛÀÇ Å©±â¸¦ ÁöÁ¤ÇÏ´Â ºÎºÐÀÌ¶ó º¸¸éµË´Ï´Ù. SOMAXCONN´Â ±× ÄÄÇ»ÅÍÀÇ ÇÏ µå¿þ¾î¿¡¼­ »ç¿ë°¡´ÉÇÑ ÃÖ´ëÀÇ °ªÀ» ÀǹÌÇÕ´Ï´Ù. µðÆúÆ®°ªÀÔ´Ï´Ù. ^^; if( listen(ServerSocket,SOMAXCONN) == SOCKET_ERROR ) printf( "listenÇÔ¼ö ¼³Á¤À» ½ÇÆÐÇß½À´Ï´Ù.\n" ); Âü°í·Î listenÀÇ µÎ¹ø° ÀÎÀÚ¿¡ ´ëÇÑ °ªÀº ´ç¿¬È÷ ÃÖ´ë°ªÀ» Àâ´Â°Ô ´ç¿¬ÇÑ°Ô ¾Æ´Ò ±î¿ä? ±¦È÷ ÀÛ°Ô ÀâÀ» ÀÌÀ¯´Â ¾øÁÒ. Çϵå¿þ¾î°¡ Áö¿øÇÏ´Â ÃÖ´ë°ªÀ» ³Ö´Â°Ç ³Ê¹«³ª ´ç¿¬ÇÑ °ÅÁÒ. À§¿Í °°ÀÌ ¾²´Â°Ç ´ç¿¬ÇÑ°ÅÁÒ. ^^; [´©±º°¡ÀÇ ¿¬°áÀ» ±â´Ù·Á ºÁ¿ä.] Áö±Ý±îÁöÀÇ °úÁ¤µéÀ» ¾Æ·¡¿¡ ³ª¿­ÇÏÁÒ. ^^; WSAStartup(); socket(); bind(); listen(); ¿¬°áÀ» ±â´Ù·ÁºÁ¿ä~ <=¿©±âÀÔ´Ï´Ù. ^^; closesocket(); WSACleanup(); ÀÌÁ¦ ¼­¹öÇÁ·Î±×·¥Àº Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó¸¸À» ±â´Ù¸®¸é µÇ´Â°Ì´Ï´Ù. ±× ÇÔ¼ö´Â ´Ù¸§ ¾Æ´Ñ acceptÀÔ´Ï´Ù!! ½ÇÁ¦ Äڵ带 º¼±î¿ä? ^^; int AddressSize = sizeof( ClientAddress ); //ÁÖ ¼Ò Å©±â¸¦ ÀúÀåÇÏ´Â //º¯¼ö. SOCKADDR_IN ClientAddress; //Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò Á¤º¸¸¦ ´ãÀ» ±¸Á¶Ã¼. SOCKET ClientSocket; //Ŭ¶óÀ̾ðÆ® ¼ÒÄÏ. ClientSocket = accept( ServerSocket,(struct sockaddr*)&ClientAddress, &AddressSize ); SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen ); s : Á¢¼ÓÀ» ¹Þ¾ÆµéÀÏ ¼ÒÄÏ( ¼­¹öÀÇ ¼ÒÄÏ ) addr : Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò¸¦ ´ãÀ» ±¸Á¶Ã¼ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ¾Æ·¡¿Í °°´Ù¸é...... ¼­¹ö : "169.254.34.243", port : 5001; °á°ú´Â ¾Æ·¡¿Í °°½À´Ï´Ù. Á¢¼ÓÀÚÀÇ Á¤º¸¸¦ ¾ò¾î¿À´Â °Ì´Ï´Ù. ClientAddress.sin_family => AF_INET ClientAddress.sin_family => 5002 ClientAddress.sin_family => "169.254.34.244" AddressSize : ÁÖ¼Ò¸¦ ¾ò¾î¿Ã ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ³Ö½À´Ï´Ù. Áï, accept·Î Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÁÖ¼Ò¿Í ¼ÒÄÏÀ» ¸ðµÎ ¾Ë¼ö ÀÖ½À´Ï´Ù. Áß¿äÇÑ °Ç ¼ÒÄÊÀÔ´Ï´Ù. ^^; ½ÇÁ¦·Î µ¥ÀÌÅ͸¦ Ŭ¶óÀ̾ðÆ®·Î º¸³¾¶§ »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ÇÊ¿äÇÑ ÀÎ ÀÚ´Â ¼ÒÄÏÀ̴ϱî¿ä. ^^; Áï, ClientSocketÀº ¹Þ¾ÆµéÀ̴´ë·Î ¿¬°áÀÌ ²÷¾îÁö±â Àü±î Áö´Â ¾îµð¿¡ ÀúÀåÀ» ÇØ µÎ¾î¾ß ÇÑ´Ù´Â À̾߱â°ÚÁÒ. ^^; acceptÇÔ¼ö°¡ ³ª¿Â±è¿¡ ºí·°Å·°ú ³í ºí·°Å·¿¡ ´ëÇÑ À̾߱⸦ Âü°í·Î ÇÏ°Ú½À´Ï´Ù. ºí·°Å·Àº ÀÏÁ¾ÀÇ ¹«ÇÑ·çÇÁ¶ó°í º¸¸éµË´Ï´Ù. acceptÇÔ¼ö°¡ ±×·±µ¥¿ä. acceptÇÔ¼ö ¸¦ »ç¿ëÇÏ¸é ¿¬°áÀÌ µé¾î¿Ã¶§±îÁö ´õ ÀÌ»óÀÇ ÁøÇà¾øÀÌ ±×°÷¿¡ ¸ØÃç ¹ö¸³´Ï´Ù. ±×¸®´Ù ´Ù ¿¬°áÀÌ ¿À¸é °è¼ÓÇؼ­ ÁøÇàÀÌ µÇ´Â°ÅÁÒ. ÀÌ·± »óȲÀ» ºí·°Å·¸ðµå¶óÇÏ°í ±× ¹Ý´ë °¡ ³í ºí·°Å·ÀÌÁÒ. ±×³É Áö³ª°¡ ¹ö¸®´Â..... ^^; accept°¡ ±× ´ëÇ¥ÀûÀÎ ¿¹ÁÒ. ÀÌ¿Í °°Àº ÇÔ¼ö¸¦ ¾²½Ã´Ù°¡ ¾î? ´Ù¿îÀΰ¡? ÇÏ´Â »ý°¢À» ÇϽDZîºÁ ³ëÆĽɿ¡¼­ ÀÌ¾ß ±â¸¦ ÇÕ´Ï´Ù. [µ¥ÀÌÅ͸¦ º¸³»ºÁ¿ä~~] ÀÌÁ¦ ¿¬°áÀ» À§ÇÑ ±âº»ÀûÀÎ °ÍÀÌ ´Ù µÇ¾ú½À´Ï´Ù. Åë½ÅÀ» À§ÇÑ ¼­¹ö°¡ ¸¸µé¾îÁ³°í, ¾î¶² Ŭ¶óÀ̾ðÆ®¿¡¼­ ´©°¡ ¿¬°áÀ» Çß´ÂÁö¿¡ ´ëÇÑ ´äÀÌ ³ª¿Ô½À´Ï´Ù. ÀÌÁ¦´Â º¸³»°í ¹Þ±â¸¸ ÇÏ¸é ³×Æ®¿÷ÀÇ Á¤¸» ±âº»ÀûÀÎ °ÍÀÌ ´Ù µÇ´Â °Ì´Ï´Ù. ^^; ¸¶Áö¸· µÎ ÇÔ¼ö´Â ¹Ù·Î send(), recv()¿´´ø°ÍÀÔ´Ï´Ù!! ^^; int send ( SOCKET s, const char FAR * buf, int len, int flags ); s : µ¥ÀÌÅ͸¦ ¹ÞÀ» ¼ÒÄÏ. Áö±Ý±îÁöÀÇ ¿¹¸¦ º¸¸é ¼­¹ö¿¡ Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÎ ClientSocketÀ» ³ÖÀ¸¸é ÁÁÀ»µíÇÕ´Ï´Ù. ^^; ClientSocketÀ¸·Î µ¥ÀÌÅ͸¦ º¸³»´Â °Å¶ó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù. buf : ½ÇÁ¦ º¸³¾ µ¥ÀÌÅÍÀÇ ¹öÆÛÀÇ Æ÷ÀÎÅÍ len : º¸³¾ µ¥ÀÌÅÍÀÇ Å©±â. flags : ¿É¼ÇÀÔ´Ï´Ù¸¸ Áö±ÝÀº ±×³É "0"À¸·Î ¾Ë°í ÀÖ¾îÁֽʽÿä. ^^; ¸®ÅÏ°ª : ½ÇÁ¦·Î º¸³½ µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ®¼ö. int recv ( SOCKET s, char FAR* buf, int len, int flags ); s : µ¥ÀÌÅ͸¦ ¹ÞÀ» ¼ÒÄÏ. Áö±Ý±îÁöÀÇ ¿¹¸¦ º¸¸é ¼­¹ö¿¡ Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÎ ClientSocketÀ» ³ÖÀ¸¸é ÁÁÀ»µíÇÕ´Ï´Ù. ^^; SOCKET s¿¡¼­ µ¥ÀÌÅ͸¦ ¹Þ´Â´Ù°í »ý °¢ÇÏ½Ã¸é µË´Ï´Ù. buf : ½ÇÁ¦ µ¥ÀÌÅ͸¦ ¹ÞÀ» ¹öÆÛÀÇ Æ÷ÀÎÅÍ len : ½ÇÁ¦ µ¥ÀÌÅ͸¦ ¹ÞÀ» ¹öÆÛÀÇ Å©±â flags : ¿É¼ÇÀÔ´Ï´Ù¸¸ Áö±ÝÀº ±×³É "0"À¸·Î ¾Ë°í ÀÖ¾îÁֽʽÿä. ^^; ¸®ÅÏ°ª : ½ÇÁ¦·Î º¸³½ µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ®¼ö. ½ÇÁ¦ »ç¿ëÀ» ¾î¶»°Ô ÇÏ´ÂÁö º¼±î¿ä? [Send] char SendMessage[6] = "Test!"; int SendSize = 6; int ActualSendSize; ActualSendSize = send( ClientSocket, SendMessage, SendSize, 0 ); [Recv] int retval; char Buffer[999]; //Àû´çÈ÷ Å« ¹öÆÛ¸¦ Àâ¾ÆÁÝ´Ï´Ù. retval = recv( ClientSocket, Buffer, sizeof Buffer, 0 ); ÈÞ¿ì~~ ¿ì¼±Àº ¿©±â±îÁöÀÔ´Ï´Ù. Á¤¸» ¼ÒÄÏÀÇ ±âº»Áß¿¡ ±âº»¸¸ º¸½Å°Ì´Ï´Ù. ^^; ¾î¶§¿ä? ¾î·Á¿î°¡¿ä? ´ç¿¬È÷ óÀ½ º¸½Ã´ÂºÐÀº ¿Ü¿ï°Ô ¸¹¾Æ¼­ ¾î·Æ°Ô ´À²¸Áú¼öµµ ÀÖ À»°Ì´Ï´Ù¸¸, ÇϳªÇϳª õõÈ÷ Àß º¸½Ã¸é ºÐ¸íÈ÷ ÀüºÎ ÀÌÇØÇϽǼö ÀÖÀ»°Ì´Ï´Ù. ³×Æ® ¿÷¿¡ °üÇÑ ÀÌ·ÐÀ» Àß ÀÌÇØÇØ µÎ¼Ì´Ù¸é À§ÀÇ ³»¿ëµéÀº ÀÌ·ÐÀ» ÄÚµå·Î ¿Å±ä°Í¿¡ ºÒ°ú ÇÏ´Ï Àß µûÁ®º¸½Ã¸é ¾î·ÆÁö ¾Ê°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °Ì´Ï´Ù. ½ÇÁ¦ÄÚµå´Â ¾Æ·¡¿¡ ÀÖ½À´Ï´Ù. ²À ¼÷ÁöÇϽʽÿä!! //¼­¹ö ÄÚµå----------------------------------------------------------------- #include #include void main() { WSADATA wsaData; SOCKET ServerSocket; //¼ÒÄÏÀ» ¼±¾ðÇÕ´Ï´Ù. SOCKADDR_IN ServerAddress; //¼ÒÄÏÀÇ ÁÖ¼Ò Á¤º¸¸¦ ³Ö´Â ±¸Á¶Ã¼ÀÔ´Ï´Ù. unsigned short ServerPort = 5001; if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { printf( "WSAStartup¼³Á¤¿¡¼­ ¹®Á¦ ¹ß»ý.\n" ); WSACleanup(); exit( 0 ); } //¹Ýµå½Ã AF_INETÀ̾î¾ßÇÕ´Ï´Ù. ServerAddress.sin_family = AF_INET; //IPÁÖ¼Ò°ª. INADDR_ANY´Â ¾Æ¹«°Å³ªÀÔ´Ï´Ù. ^^; ServerAddress.sin_addr.s_addr = inet_addr( "210.106.224.142" ); ServerAddress.sin_port = htons( ServerPort ); //Æ÷Æ®¹øÈ£ //¼ÒÄÏÀ» ¸¸µì´Ï´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº ¾Æ·¡¿¡...... ServerSocket = socket(AF_INET, SOCK_STREAM,0); // if( ServerSocket == INVALID_SOCKET ) //¿¡·¯ ¹ß»ý½Ã ¹®±¸ Ãâ·Â. { printf( "¼ÒÄÏÀ» »ý¼ºÇÒ¼ö ¾ø½À´Ï´Ù." ); closesocket( ServerSocket ); WSACleanup(); exit( 0 ); } if( bind(ServerSocket,(struct sockaddr*)&ServerAddress,sizeof( ServerAddress) ) == SOCKET_ERROR ) { printf( "¹ÙÀε带 ÇÒ ¼ö ¾ø½À´Ï´Ù." ); closesocket( ServerSocket ); WSACleanup(); exit( 0 ); } if( listen(ServerSocket,SOMAXCONN) == SOCKET_ERROR ) { printf( "listenÇÔ¼ö ¼³Á¤À» ½ÇÆÐÇß½À´Ï´Ù.\n" ); closesocket( ServerSocket ); WSACleanup(); exit( 0 ); } SOCKET ClientSocket; SOCKADDR_IN ClientAddress; int AddressSize = sizeof( ClientAddress ); printf( "¼­¹ö·ÎÀÇ ¿¬°áÀ» ±â´Ù¸®°í ÀÖ½À´Ï´Ù.\n" ); if( (ClientSocket = accept( ServerSocket,(struct sockaddr*) &ClientAddress , &AddressSize )) == INVALID_SOCKET ) { printf( "Accept½Ã ¹®Á¦ ¹ß»ý.....\n" ); getchar(); } else { printf("Á¢¼Ó IP: %s, Æ÷Æ® : %d\n", inet_ntoa (ClientAddress.sin_addr), htons(ClientAddress.sin_port)) ; } closesocket( ServerSocket ); //¼ÒÄÏÀ» ´Ý½À´Ï´Ù. WSACleanup(); printf( "¼­¹ö ÇÁ·Î±×·¥ÀÌ Á¾·á µÇ¾ú½À´Ï´Ù.\n" ); getchar(); } //¼­¹ö ÄÚµå ================================================================== WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #04 ÁöÀºÀÌ : Á¤ÇöÈ£ * Áö³­ ½Ã°£¿¡´Â À©µµ¿ì ¼ÒÄÏ ÃʱâÈ­¸¦ ¼­¹ö ÇÁ·Î±×·¥(?)À» ¿¹·Î µé¾î ¼³¸íÀ» Çß¾ú ½À´Ï´Ù. À̹ø ½Ã°£¿¡´Â Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥¿¡ ´ëÇÑ À̾߱⸦ ÇÏ·ÁÇÕ´Ï´Ù. ¼­¹ö ÇÁ ·Î±×·¥°ú ±×´ÙÁö ´Ù¸¦Á¡Àº ¾ø½À´Ï´Ù. ¼­¹ö¿¡¼­ listenÇÔ¼ö·Î Á¢¼ÓÀ» ±â´Ù·È´ø ºÎºÐ À» Ŭ¶óÀ̾ðÆ®¿¡¼­´Â connectÇÔ¼ö·Î Á¢¼ÓÀ» ÇÏ´Â ºÎºÐÀÌ ´Þ¶óÁú»ÓÀÔ´Ï´Ù. µû¶ó¼­ À̹ø °Ô½Ã¹°¿¡¼­´Â ±×·¸°Ô ¸¹ÀÌ ´Ù·ê ³»¿ëÀº ¾øÀ»µíÇÕ´Ï´Ù. °ÅÀÇ´Ù Áö³­ ½Ã°£¿¡ »ç ¿ëÇß´ø ÇÔ¼öµé°ú ´Ù¸¦¹Ù°¡ ¾ø°Åµç¿ä. ^^; Áö³­ °Ô½Ã¹°À» Àß ÀÐÀ¸½Å ºÐµéÀº Å« ¹«¸® ¾øÀÌ À̹ø °Ô½Ã¹°Àº ±×³É ÀÐ°í ³Ñ¾î°¡´Â Á¤µµÀÏ°Ì´Ï´Ù. [¿¹Á¦ÄÚµå ÇÁ·ÎÁ§Æ® ±¸¼º¹× »ç¿ë¹ý] ÀÌ °Ô½Ã¹°¿¡ °üÇÑ ¿¹Á¦´Â Network\TCP\Client¿¡ ÀÖ½À´Ï´Ù. ÇÁ·ÎÁ§Æ®¿¡ ws2_32.lib wsock32.lib ÆÄÀÏÀ» ÀçÁ¤ÀÇ ÇϼžßÇÕ´Ï´Ù. »ç¿ë¹ý] Client ¼­¹öÇÁ·Î±×·¥ÀÇIPÁÖ¼Ò ¼­¹öÇÁ·Î±×·¥ÀÇÆ÷Æ®¹øÈ£(2000-65535Áõ ¾Æ¹«°Å³ª) ¼­¹öÀÇ IPÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£´Â Áö³­°Ô½Ã¹°¿¡¼­ ¼­¹öÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇß´ø ÀÎÀÚÀÎ IP¿Í Æ÷Æ®¹øÈ£¿Í °°Àº °ªÀ» ÀÔ·ÂÇϸéµË´Ï´Ù. ¸¸ÀÏ ÀÚ½ÅÀÇ IP°¡ 111.222.111.222¶ó¸é? server 111.222.111.222 5001 client 111.222.111.222 5001 [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *[Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ±¸Á¶¿Í ¼­¹ö ÇÁ·Î±×·¥ÀÇ ±¸Á¶´Â ¾î¶»°Ô ´Ù¸¦±î?] [Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ±¸Á¶¿Í ¼­¹ö ÇÁ·Î±×·¥ÀÇ ±¸Á¶´Â ¾î¶»°Ô ´Ù¸¦±î?] ¾Æ·¡ÀÇ ¿¹°¡ Á¤È®ÇÑ ¿¹¶ó°í ¸»ÇÒ¼ö´Â ¾ø½À´Ï´Ù¸¸, Ŭ¶óÀ̾ðÆ®/¼­¹ö( ÀÌÇÏ : C/S ) ÀÇ ´ëÇ¥ÀûÀÎ(?) ¿¹¶ó°í ÇÒ¼ö ÀÖ½À´Ï´Ù. ´ëÇ¥ÀûÀÎ ¿¹ ¸Â³ª? -_-; [¼­¹ö] [Ŭ¶óÀ̾ðÆ®] WSAStartup(); WSAStartup(); socket(); socket(); bind(); bind(); listen(); accept(); connect(); send() / recv() send()/recv(); closesocket(); closesocket(); WSACleanup(); WSACleanup(); Áö³­ ½Ã°£¿¡ ´Ù·é ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®´Â Å©°Ô ´Ù¸¦°Ô ¾ø½À´Ï´Ù. ¼­¹öÀÇ listen, listen´ë½Å Ŭ¶óÀ̾ðÆ®¿¡´Â connet°¡ ÀÖÀ»»ÓÀÔ´Ï´Ù. ´Ù½Ã ÇÑ ¹ø °­Á¶ ÇÏÁö¸¸ ´Þ¶ó Áø Á¡Àº °ÅÀÇ ¾ø½À´Ï´Ù. [connect()] int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen ); s : ¼³Á¤ÇÑ ¼ÒÄÏÀÔ´Ï´Ù. name : ¿¬°áÇÒ ¼­¹öÀÇ ÁÖ¼Ò¿¡ ´ëÇÑ Á¤º¸¸¦ ³ÖÀº ±¸Á¶Ã¼ÀÔ´Ï´Ù. ^^; namelen : sockaddrÀÎÀÚÀÇ Å©±â¸¦ ³ÖÀ¸¸é µË´Ï´Ù. ¸®ÅÏ°ª : ¼º°øÀûÀ¸·Î ¿¬°áÀÌ µÉ °æ¿ì 0ÀÌ ¸®Åϵ˴ϴÙ. ½ÇÁ¦ Äڵ带 ³ª¿­ÇØ º¸µµ·Ï ÇÏÁÒ. //Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ±¸Á¶¸¦ ºÁ¿ä.---------------------------------------- #include #include void main() { WSADATA wsaData; SOCKET Socket; //¼ÒÄÏÀ» ¼±¾ðÇÕ´Ï´Ù. SOCKADDR_IN ServerAddress; //¼ÒÄÏÀÇ ÁÖ¼Ò Á¤º¸¸¦ ³Ö´Â ±¸Á¶Ã¼ÀÔ´Ï´Ù. unsigned short Port = 5001; //Æ÷Æ® ¹øÈ£. int ReturnVal; //À©µµ¿ì ¼ÒÄÏÀ»À§ÇÑ ÃʱâÈ­.... if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { printf( "WSAStartup¼³Á¤¿¡¼­ ¹®Á¦ ¹ß»ý.\n" ); WSACleanup(); exit( 0 ); } //¼­¹ö¿ÍÀÇ ¿¬°áÀ» À§ÇÑ ¼ÒÄÏÀ» ¸¸µì´Ï´Ù. Socket = socket(AF_INET, SOCK_STREAM,0); // if( Socket == INVALID_SOCKET ) //¿¡·¯ ¹ß»ý½Ã ¹®±¸ Ãâ·Â. { printf( "¼ÒÄÏÀ» »ý¼ºÇÒ¼ö ¾ø½À´Ï´Ù." ); WSACleanup(); exit( 0 ); } //¹Ýµå½Ã AF_INETÀ̾î¾ßÇÕ´Ï´Ù. ServerAddress.sin_family = AF_INET; //IPÁÖ¼Ò°ª. INADDR_ANY´Â ¾Æ¹«°Å³ªÀÔ´Ï´Ù. ^^; ServerAddress.sin_addr.s_addr = inet_addr( "210.106.224.142" ); ServerAddress.sin_port = htons( Port ); //Æ÷Æ®¹øÈ£ //ÁöÁ¤ÇÑ ¼­¹ö·Î ¿¬°áÀ» ÇØ º»´Ù. ReturnVal = connect( Socket, (struct sockaddr*)&ServerAddress, sizeof(ServerAddress) ); //ReturnValÀÌ 0ÀÌ ¾Æ´Ï¸é, ¹®Á¦°¡ ÀÖ´Â °æ¿ìÀÔ´Ï´Ù. if( ReturnVal ) { printf( "¼­¹ö·Î ¿¬°áÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù.\n" ); closesocket( Socket ); WSACleanup(); exit( 0 ); } else { printf( "¼­¹ö Á¢¼ÓÀÌ ¼º°øÇß½À´Ï´Ù.\n" ); } closesocket( Socket ); //¼ÒÄÏÀ» ´Ý½À´Ï´Ù. WSACleanup(); printf( "Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÌ Á¾·á µÇ¾ú½À´Ï´Ù.\n" ); getchar(); } //Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ±¸Á¶¸¦ ºÁ¿ä.---------------------------------------- ¾Õ ¼­¹ö ÇÁ·Î±×·¥°ú ´Þ¶óÁø ºÎºÐ¸¸ ÁýÁßÀûÀ¸·Î º¸½Ã¸é ÁÁÀ» µíÇÕ´Ï´Ù. ÀÌ»óÀ¸·Î ±âº»ÀûÀΠŬ¶óÀ̾ðÆ®¿Í ¼­¹öÀÇ Á¢¼ÓÀ» ¸¶Ä¨´Ï´Ù. ´ÙÀ½ °Ô½Ã¹°ºÎÅÍ´Â ½ÇÁ¦ ·Î ³×Æ®¿÷»ó¿¡¼­ µ¥ÀÌÅ͸¦ º¸³»º¸ÁÒ. ^^; WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #05 ÁöÀºÀÌ : Á¤ÇöÈ£ *//////////////////////////////////////////////////////////////////////////// // Á¦ ±ÛµéÀº Àý´ë·Î »ó¾÷Àû ¸ñÀûÀ¸·Î »ç¿ëµÉ¼ö ¾øÀ¸¸ç, ÀúÀÚÀÎ ÀúÀÇ Çã¶ô¾ø // // ÀÌ´Â ±× ¾î´À°÷¿¡µµ °Ô½Ã¸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù. // ////////////////////////////////////////////////////////////////////////////* ±âŸ ±Ã±ÝÇÑ »çÇ×Àº ¾Æ·¡·Î ¹®ÀǸ¦ ¹Ù¶ø´Ï´Ù. ashulam@hitel.net ashulam@isoft.co.kr * À̹øÀåÀº À©µµ¿ì ¼ÒÄÏ°ú´Â ÀüÇô °ü·ÃÀÌ ¾ø´Â ºÎºÐÀÔ´Ï´Ù¸¸, ²À ¾Ë¾Æ µÎ¼Å¾ß ÇÒ ºÎºÐÀÔ´Ï´Ù. ¹Ù·Î ¾²·¹µåÁÒ. ÀÌ¹Ì ¾²·¹µå¸¦ ¾Æ½Ã´Â ºÐÀ̶ó¸é °¡º±°Ô ³Ñ±â½Ã¸é µÉÅ× °í ¸ð¸£½Ã´Â ºÐÀº Àß ¼÷ÁöÇØ µÎ¼Å¾ß ÇÒ°Ì´Ï´Ù. ¾²·¹µå¸¦ ¾Ë±â¿¡ °¡Àå ÁÁÀº ¹æ¹ýÀº ¿î¿µÃ¼Á¦¿¡ °üÇÑ Ã¥À» °øºÎÇØ º¸½Ã´Â°ÍÀÔ´Ï´Ù¸¸, ½Ã°£ÀÌ ¾ÊµÇ½Ã´Â ºÐÀº ºÎµæÀÌÇÏ°Ô ¾Æ·¡ÀÇ ±ÛÀÌ¶óµµ ÀоîµÎ½Ã¸é ÀÛ°Ô³ª¸¶ µµ¿òÀÌ µÉ°Ì´Ï´Ù. ^^; [¿¹Á¦ÄÚµå ÇÁ·ÎÁ§Æ® ±¸¼º¹× »ç¿ë¹ý] À̱۰ú °ü·ÃµÈ ¿¹Á¦´Â Network\Thread¿¡ ÀÖ½À´Ï´Ù. ÇÁ·ÎÁ§Æ®¸¦ Ưº°È÷ ¼öÁ¤ÇÒ ÇÊ¿äµµ ¾øÀ¸¸ç Ưº°ÇÑ ÀÎÀÚµµ ¾ø½À´Ï´Ù. [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *¾²·¹µå¶õ? *¾²·¹µå¸¦ ¸¸µé±â. *¾²·¹µå¸¦ »ç¿ëÇÑ ¼­¹öÀÇ Á¢¼Ó ó¸® ºÎºÐ. 5. ¾²·¹µå( Thread ) Áö±Ý±îÁö´Â ¿©·¯ºÐ°ú º» ³»¿ëÀº ´ÜÁö, ƯÁ¤ÇÑ IP¿Í Æ÷Æ®¸¦ °¡Áø ¼­¹ö·Î Á¢¼ÓÀ» ÇÏ °í ¿¬°áÀ» ²÷´Â°ÍÀÌ ÀüºÎ¿´½À´Ï´Ù. À̹øÀå¿¡¼­´Â ¿ø·¡ µ¥ÀÌÅÍ ¼Û¼ö½ÅÀ¸·Î ¹Ù·Î µé ¾î°¡·Á°í Çß½À´Ï´Ù¸¸, Å¥ ¸¸µé±â³ª À©¼Ó À̺¥Æ® 󸮵µ ÀÖ°íÇؼ­ ¾²·¹µå¸¦ °£´ÜÈ÷ ¤°í ³Ñ¾î°¡º¸°Ú½À´Ï´Ù. ÁøÂ¥ ¼­¹ö¸¦ Á¦´ë·Î ¸¸µé·Á¸é ÀÌ ¾²·¹µå °ü¸®°¡ »ý¸íÀÔ´Ï ´Ù¸¸, Á¦ ±ÛÀÇ ¸ñÀûÀº ¾îµð±îÁö³ª À©¼ÓÀÔ´Ï´Ù. ¾²·¹µå¸¦ ±í°Ô ´Ù·ê¼ö´Â ¾ø°í À©¼Ó À» »ç¿ëÇϴµ¥ ¹®Á¦°¡ ¾øÀ» Á¤µµ·Î¸¸ º¸°Ú½À´Ï´Ù. ¾²·¹µå´Â ¿©·¯ºÐ²²¼­ Á÷Á¢ °øºÎ ¸¦ ÇØ µÎ½Ã´Â°Ô ÁÁ½À´Ï´Ù. *¾²·¹µå¶õ? ¾²·¹µå¸¦ º¸±âÀü¿¡ ÇÔ¼ö È£Ãâ°úÁ¤À» º¸µµ·Ï ÇÏÁÒ. ^^; void main() { Function_1(); Function_2(); . . Fucntion_N(); } À§ÀÇ ¿¹¸¦ º¸¸é Function1~N±îÁöÀÇ ÇÔ¼öµéÀÌ ½ÇÇàµÈ´Ù´Â »ç½ÇÀº ºÐ¼®(?)ÇÏÁö ¾Ê¾Æ µµ ´©±¸³ª ´Ù ¾Æ½Ç°Ì´Ï´Ù. ±× °úÁ¤µµ ´Ù ¾Æ½Ã°ÚÁö¸¸, ÇÑ ¹ø ¼³¸íÇÏÀÚ¸é...... mainÇÔ¼ö´Â ÇÁ·Î±×·¥ÀÇ Á¦¾î±ÇÀ» Fucntion_1À¸·Î ³Ñ±â°í Function1Àº ÀÚ½ÅÀÇ ³»¿ë À» ½ÇÇàÇÕ´Ï´Ù. ÀüºÎ ½ÇÇàÇÏ°í ³ª¸é Á¦¾î±ÇÀº ´Ù½Ã mainÇÔ¼ö·Î µ¹¾Æ¿À°Ô µË´Ï´Ù. ´ÙÀ½ Áß¿¡ ¹Ù·Î º¸ÀÌ´Â Function_2·Î mainÇÔ¼ö´Â ´Ù½Ã Á¦¾î±ÇÀ» ³Ñ±â°í Function_2 ÇÔ¼ö°¡ ½ÇÇàµÇ°í Á¦¾î±ÇÀº ´Ù½Ã mainÀ¸·Î µ¹¾Æ¿À°Ô µË´Ï´Ù. ±× °úÁ¤ÀÌ Function_N ±îÁö °è¼ÓµÇ°í mainÇÔ¼ö´Â Á¾·áµÇ°Ô µË´Ï´Ù. ±×·³ ¾²·¹µå´Â ¹¹³Ä? ¹Ù·Î ±×°É ¼³¸í Çϱâ À§ÇØ À§ÀÇ °úÁ¤À» ¼³¸íÇÑ °Ì´Ï´Ù. ¿ì¼±Àº ¾²·¹µåµµ ÇϳªÀÇ ÇÔ¼ö¶ó°í »ý°¢ÇÏ½Ê ½Ã¿ä. ±×¸®°í ¾Æ·¡ÀÇ °úÁ¤À» º¸µµ·Ï ÇÏÁÒ. void main() { Thread_1(); Thread_2(); . . Thread_N(); } À§¿Í°°ÀÌ ¾²·¹µå°¡ N°³ ÀÖ½À´Ï´Ù. mainÇÔ¼ö°¡ ½ÇÇàµÇ¸é, ´ç¿¬È÷ ÇÁ·Î±×·¥ÀÇ Á¦¾î ±ÇÀº mainÀÌ °¡Áö°Ô µË´Ï´Ù. ´ÙÀ½ Thread_1À» È£ÃâÇϸé, ÇÁ·Î±×·¥ÀÇ Á¦¾î±ÇÀÌ Thre ad_1À¸·Î ³Ñ¾î°¡´Â°ÍÀÌ ¾Æ´Ï¶ó Á¦¾î±ÇÀº main¿¡ ±×´ë·Î ³²¾ÆÀÖ°í, µ¶¸³ÀûÀÎ Á¦¾î±Ç À» °¡Áø ÇϳªÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ°í mainÇÔ¼ö³»ÀÇ Á¦¾î±ÇÀº ±×´ë·Î À¯ÁöµÈ´Ù°í º¸½Ã¸é µË´Ï´Ù. Áï, ÇÔ¼ö¿Í°°ÀÌ ÇϳªÀÇ È帧À» °¡Áö°í °¬´Ù¿Ô´ÙÇÏ´Â ±¸Á¶°¡ ¾Æ´Ï¶ó ÀÚ½ÅÀÇ Á¦¾î±ÇÀº °è¼Ó ÀÎÁ¤µÇ°í ÇÁ·Î±×·¥À» ÁøÇàÇϸ鼭 ¾²·¹µå¸¦ È£ÃâÇϸé ÇÔ¼öµéÀÌ »ì¾Æ ÀÖ´Â »óÅ·Π°è¼Ó À¯ÁöµÇ´Â °Ì´Ï´Ù. À§¿Í °°Àº °æ¿ì´Â N°³ÀÇ ÇÔ¼öµéÀÌ ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ¶§±îÁö °è¼Ó »ì¾ÆÀÖ´Ù°í º¸½Ã¸é µË´Ï´Ù. µµ½º¶§ ÇÁ·Î±×·¥À» ÇØ º¸½ÅºÐÀ̸é, ·¥»óÁÖ ÇÁ·Î±×·¥À» »ý°¢ÇϽøé ÁÁ°Ú°í¿ä. À©µµ ¿ì APIÇÁ·Î±×·¥À» ÇØ º¸½ÅºÐµéÀº À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ »ý°¢ÇØ Áֽøé ÀÌÇØ°¡ Á¶±ÝÀº ½±°Ô µÇÁö ¾ÊÀ»±î ½Í½À´Ï´Ù. ÇÏÁö¸¸, À§ÀÇ ¸» ¸î¸¶µð·Î ¾²·¹µå¸¦ óÀ½ Á¢ÇϽô ºÐµé²²¼­ ½±°Ô ÀÌÇØÇÏÁö´Â ¸ø ÇϽǰ̴ϴÙ. ¾ÕÀ¸·Î ³ª¿Ã Äڵ带 º¸¸ç ÀÌÇظ¦ ÇϽðí, À©µµ¿ì °ü·ÃÃ¥¿¡ ª°Ô ³ª¿Â ¾²·¹µå¿¡ °üÇÑ Áö½ÄÀÌ¶óµµ Áö¼ÓÀûÀ¸·Î º¸´Ùº¸¸é ÀÌÇظ¦ ÇϽǼö ÀÖÀ»°Ì´Ï´Ù. ^^; ±×¸®°íº¸´Ï Hitel GMA °­Á¶õ¿¡µµ ¾²·¹µå¿¡ °üÇÑ °£´ÜÇÑ ¿¹°¡ ÀÖÀ¸´Ï ÂüÁ¶ÇÏ½Ã¸é µµ¿òÀÌ µÉ°Ì´Ï´Ù. ^^; *¾²·¹µå¸¦ ¸¸µé±â. ¾Õ¿¡¼­µµ À̾߱âÇßÁö¸¸, ¾²·¹µå´Â È£ÃâÇϸé ÇÁ·Î±×·¥ È帧¿¡ ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê°í °è¼Ó »ì¾ÆÀÖ´Â ÇÔ¼ö¶ó°í Á¤ÀÇÇß¾ú½À´Ï´Ù. ¿Ö Á¦°¡ ÇÔ¼ö¶ó°í Á¤ÀÇ Çß´ÂÁö´Â ¾Æ·¡¿¡ ±â¼úµÉ ¾²·¹µåÀÇ ¸ð¾çÀ» º¸¸é ¾Æ½Ç°Ì´Ï´Ù. ¿ì¼±Àº ÇüŸ¸ º¸½Ê½Ã¿ä. »ç¿ë ÄÄÆÄÀÏ·¯ : VC++ 6.0 ÄÄÆÄÀÏ ¿É¼Ç : Alt+F7À» ´©¸¥ÈÄ ÇÁ·ÎÆÛƼ ½ÃÆ®Áß C/C++À» °í¸¥ÈÄ Category Ç׸ñ ÄÞ º¸¹Ú½º¸¦ µå¶ø´Ù¿î ½ÃŲÈÄ Code Generate¸¦ ¼±ÅÃÇÕ´Ï´Ù. Use run-time libraryÀÇ Ç׸ñ Áß MultiThread¶ó´Â ´Ü¾î°¡ µé¾î°¡´Â Ç׸ñÁß ¾Æ¹«°Å³ª ¼±ÅÃÇÕ´Ï´Ù. Âü°í·Î MultiThreaded¸¦ ¼±ÅÃÇß½À´Ï´Ù //¾²·¹µå ±¸µ¿ ÇÁ·Î±×·¥------------------------------------------------------- #include #include #include unsigned long __stdcall Thread( void *arg ) { while( 1 ) { printf( "in Thread!!\n" ); Sleep( 100 ); } return 1; } void main() { unsigned long TempValL; //ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ¶§±îÁö 0.1ÃÊ °£°ÝÀ¸·Î in Thread¶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇÕ´Ï //´Ù. CreateThread( NULL, 0, Thread, 0, 0, &TempValL ); //¾²·¹µå¸¦ ±¸µ¿ÇÑÈÄ Á¦¾î±ÇÀÌ ¸ÞÀÎ ÇÔ¼ö·Î µ¹¾Æ¿ÔÀ¸¸é, ¾Æ·¡ÀÇ ±¸¹®ÀÌ µ¿ÀÛÇÕ //´Ï´Ù. Áï, ¾Æ·¡ÀÇ ¹®±¸°¡ ³ª¿À¸é ÇöÀç ÇÁ·Î±×·¥ÀÌ Thread()¾È¿¡ ¸Ó¹°°í ÀÖÁö //¾ÊÀ½À» ¾Ë ¼ö ÀÖ½À´Ï´Ù. printf( "In Main.\n" ); //¾Æ¹«Å°³ª ´©¸£¸é Á¾·áÇÕ´Ï´Ù. getchar(); } //¾²·¹µå ±¸µ¿ ÇÁ·Î±×·¥======================================================= óÀ½ º¸½Ã´Â ÇÔ¼öµéÀ» º¸°Ú½À´Ï´Ù. HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // º¸¾È ¼Ó¼º DWORD dwStackSize, // ½ºÅà ũ±â LPTHREAD_START_ROUTINE lpStartAddress, // ¾²·¹µå ÇÔ¼öÀÇ Æ÷ÀÎÅÍ LPVOID lpParameter, // ¾²·¹µå¿¡ µé¾î°¥ ÀÎÀÚ DWORD dwCreationFlags, // ¾²·¹µå »ý¼º½Ã ¿É¼Ç. LPDWORD lpThreadId // ¾²·¹µå ID¿¡ ´ëÇÑ Æ÷ÀÎÅÍ. ); lpThreadAttributes : ¾²·¹µå Çڵ鿡 ´ëÇÑ »ó¼ÓÀ̳ª Ư¼ºÀ» °áÁ¤Áþ´Â ¿É¼ÇÀ̶ó°í Çϴµ¥ Àü NULLÀ» ¾Ö¿ëÇÏÁÒ. ^^; dwStackSize : ¾²·¹µå¿¡ ÇÒ´çµÉ ½ºÅÃÀÇ Å©±â. 0ÀÎ À½¼ö¸é µðÆúÆ®°ªÀ» ¼³Á¤ ÇØÁִµ¥, ºÒ·ÁÁø ¾²·¹µå¿Í °°Àº Å©±â¸¦ Àâ½À´Ï´Ù. lpStartAddress : ¾²·¹µåÀÇ ÁÖ¼Ò lpParameter : ¾²·¹µåÀÇ ÀÎÀÚ°ª À§ÀÇ ¿¹Áß¿¡¼­´Â unsigned long __stdcall Thread( void *arg )¿¡ void *argÀÎÀÚ·Î ³Ñ¾î°¥ °ªÀÔ´Ï´Ù. dwCreationFlags : »ý¼º½Ã ¹Ù·Î »ý¼ºµÉ°ÍÀÎÁö ƯÁ¤ÇÑ ¿É¼Ç¿¡ ÀÇÇØ »ý¼ºµÉ °ÍÀÎ Áö¸¦ °áÁ¤ÇÕ´Ï´Ù. lpThreadId : ¾²·¹µå ID¿¡ ´ëÇÑ Æ÷ÀÎÅÍ. ¸®ÅÏ°ª : ¾²·¹µå¿¡ ´ëÇÑ ÇÚµéÀÌ ¸®Åϵ˴ϴÙ. ¾²·¹µå »ý¼º ½ÇÆнÿ£ NULLÀÌ ¸®Åϵ˴ϴÙ. Àúµµ ¾²·¹µå¸¦ ±í°Ô »ç¿ëÇØ º¸Áö ¸øÇØ À§¿¡ ¼³¸íÇÑ ³»¿ë ¸ðµÎ¸¦ »ç¿ëÇÏÁö ¸øÇÏ°í ÀüºÎ ¾ËÁöµµ ¸øÇÕ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì µðÆúÆ® ¼³Á¤À¸·Î »ç¿ëÇÕ´Ï´Ù. ^^; ¾²·¹µå¸¦ ¸¸µå´Â ¹æ¹ýÀº CreateThread¸»°íµµ _begintherad, _beginthreadex°¡ ÀÖ ½À´Ï´Ù. _beginthreadex´Â NT(Win2000)ȯ°æ¿¡¼­¸¸ ÀÛµ¿ÇÕ´Ï´Ù. Àúµµ óÀ½¿¡ _begin threadex »ç¿ëÇß´Ù°¡ ¹° ¸¹ÀÌ ¸Ô¾ú¾ú½À´Ï´Ù. À©98¿¡¼­´Â ¾Êµ¹¾Æ°£´Ù°í.... ^^; *¾²·¹µå¸¦ ¾ø¾Ö±â. º°·Î ÃßõÇÏÁö´Â ¾Ê´Â ¹æ¹ýÀÌÁö¸¸, TerminateThreadÇÔ¼öÀÔ´Ï´Ù. ±× »ç¿ë¹ýÀº ¾Æ·¡ ¿Í °°½À´Ï´Ù. ¾²·¹µå¸¦ ¸¸µé°í ¾òÀº ÇÚµéÀ» ÀÌ¿ëÇؼ­ ¾²·¹µå¸¦ ¾ø¾Ö´Â ¹æ¹ýÀÌÁÒ. HANDLE hThread; hThread = CreateThread( NULL, 0, Thread, 0, 0, &TempValL ); . . . TerminateThread( hThread, 0 ); //Thread¶ó´Â ¾²·¹µå¸¦ ¾ø¾Ø´Ù. *BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode ); HANDLE hThread : ¾²·¹µåÀÇ ÇÚµé. DWORD dwExitCode : ¾²·¹µå Á¾·á½Ã ¸®Å쵃 °ª. ¸®ÅÏ°ª : ¼º°ø½Ã¿£ 0ÀÌ ¾Æ´Ñ°ªÀÌ ¸®Åϵ˴ϴÙ. °¡Àå ¾ÈÁ¤ÀûÀÎ ¹æ¹ýÀº ¾²·¹µåµµ ³»ºÎÀÇ Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ» °æ¿ì Á¾·á ½ÃÅ°ÁÖ´Â °æ ¿ìÀÔ´Ï´Ù. À§ÀÇ ¿¹¸¦ º¸¸é, while( 1 )À̶ó´Â ¹«Áö¸·ÁöÇÑ ·çÇÁ¾È¿¡¼­ °¤Çô Çì¾î³ª Áö ¸øÇÏ°í ÀÖ½À´Ï´Ù¸¸, ¾²·¹µå¸¸À» À§ÇÑ Àü¿ª º¯¼ö¸¦ ¸¸µé¾î ¾²·¹µå¸¦ ¿ÜºÎ¿¡¼­ ²¨ ÁÖ´Â ¹æ¹ýÀÌ ÁÁ½À´Ï´Ù. TerminateThread°¡ ¿Ö ¾ÊÁÁÀ¸³Ä? ±× ÀÌÀ¯´Â ¹Ù·Î °­Á¦¼º¿¡ ÀÖ½À´Ï´Ù. À§ÀÇ ¿¹´Â °£´ÜÈ÷ ¹®ÀÚ¿­À» È­¸é¿¡ Ãâ·ÂÇÏ´Â°Ô °íÀÛÀÌ¶ó º°¹®Á¦°¡ µÇÁö ¾Ê½À´Ï´Ù. ÇÏÁö¸¸ ¾² ·¹µå¾È¿¡¼­ ¸î½Ê¸Þ°¡ ȤÀº ±× ÀÌ»óÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ÇØÁ¦ÇÏÁö ¾ÊÀº »óÅ¿¡¼­ °­Á¦·Î Á¾·áÇß´Ù°í »ý°¢ÇØ º¸½Ê½Ã¿ä. ¸Þ¸ð¸® »õ´Â°Ç ºÒ º¸µí »·ÇÕ´Ï´Ù. ȤÀº ÀÏÁ¤ ÇÑ Ã³¸®°úÁ¤À» °ÅÄ¡Áö ¾Ê°í Áß°£¿¡ ¾û¶×ÇÑ °ªÀ» °¡ÁøÈÄ °á°ú°ªÀ» ¸®ÅÏÇÑ´Ù¸é ¿Ã¹Ù ¸¥ 󸮰¡ µÇÁö ¾Ê°ÚÁÒ? ÇÏÁö¸¸, À§¿Í°°ÀÌ ±× ³»¿ëÀÌ Áß°£¿¡ °­Á¦·Î Á¾·áÇصµ º° ¹®Á¦°¡ µÇÁö ¾Ê´Â »óȲÀ̶ó´Â Á¡À» È®½ÇÈ÷ ¾Ë°í °è½Å´Ù¸é, ¾ó¸¶µçÁö »ç¿ëÇصµ ÁÁ½À ´Ï´Ù. Ç×»ó ³ª»Ú´Ù´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ^^; *¾²·¹µå¸¦ »ç¿ëÇÑ ¼­¹öÀÇ Á¢¼Ó ó¸® ºÎºÐ. ±×·³ ÀÌÁ¦ ±îÁö ¿Ö ¾²·¹µå »ç¿ë¹ý¿¡ ´ëÇؼ­ ¹è¿ü´ÂÁö ¾îµð¿¡ ¾²·¹µå¸¦ ¾µÁö¸¦ ÀÌ Á¦ ¹àÇô¾ß µÉ ¶§°¡ ¿Â µí Çϱº¿ä. ^^; ¾²·¹µå¸¦ »ç¿ëÇÑ ÀÌÀ¯´Â ¹Ù·Î À©µµ¿ì ¼ÒÄÏÀ» Á» ´õ ±ò²ûÇÏ°Ô »ç¿ëÇϱâ À§ÇÔ°ú À© ¼Ó¿¡ ÀÖ´Â ºí·°Å·¸ðµå(¹«ÇÑÁ¤ ±â´Ù¸®´Â)·Î ÀÛµ¿ÇÏ´Â ÇÔ¼ö ¶§¹®ÀÔ´Ï´Ù. ù° ±ò±ÝÇÑ »ç¿ëÀ̶õ ¾²·¹µå·Î À©µµ¿ì ¼ÒÄÏ¿¡ µé¾î¿À´Â ¸Þ½ÃÁö¸¦ Àâ¾Æ³»¼­ »ç¿ë Çϱâ À§ÇÔÀÔ´Ï´Ù. ¾²·¹µå ¾È¿¡ Á¢¼Ó¿äû/Á¢¼Ó²÷±è/µ¥ÀÌÅÍ ¹Þ±âµîÀÇ ±â´ÉÀ» ¸ðµÎ ¸ð ¾Æ ³Ö°í ±× ¸Þ½ÃÁö¿¡ µû¶ó 󸮸¦ ÇØÁÖ´Â °Ì´Ï´Ù. À©µµ¿ì ÇÁ·Î±×·¥¿¡¼­ ÇÁ·Î½ÃÁ®¾È ¿¡ Å°ÀÔ·ÂÀ̳ª ¸¶¿ì½º ¿òÁ÷ÀÓ°°Àº ºÎºÐ¿¡ ´ëÇÑ Ã³¸®¸¦ ³Ö¾î µÎ´Â°Í 󷳿ä. À©µµ¿ì ÇÁ·Î±×·¥¿¡¼­ ÇÁ·Î½ÃÁ®´Â ó¸®ÇؾßÇÒ ¸Þ½ÃÁö°¡ ³Ê¹« ¸¹±â ¶§¹®¿¡ ³­ÀâÇØ Áö´Â ´ÜÁ¡ ÀÌ ÀÖ¾ú½À´Ï´Ù¸¸, À©µµ¿ì ¼ÒÄÏÀ¸·Î ³Ñ¾î¿À´Â ¸Þ½ÃÁö´Â ¸¹Áö ¾Ê±â ¶§¹®¿¡ ÀÌ ¹æ¹ýÀÌ ¾ÆÁÖ È¿À²ÀûÀÔ´Ï´Ù. µÑ°´Â ºí·°Å· ÇÔ¼öµé ¶§¹®ÀÌÁÒ. ¼­¹ö ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÇØ¾ß ÇÒ ÀÏÀÌ ÇѵÑÀÌ ¾Æ´Ñµ¥, accept()ÇÔ¼ö Çϳª ½ÇÇàµÇ¸é, ¿¬°áÀÌ ¿À±âÀü±îÁö´Â ¹Ù·Î ¸ØÃç ¹ö¸³´Ï´Ù. Á¢¼Ó¿¡ °üÇÑ ºÎºÐÀ» ¿ÜºÎ·Î »© ¹ö¸®¸é, Áï ¾²·¹µå¿¡ ³Ö°í ¼­¹ö°¡ ÇؾßÇÒ ÀÏÀ» Çϸç Á¢¼ÓÀÌ µé¾î¿À¸é ¾²·¹µå¿¡¼­ 󸮸¦ ÇØ ¹ö¸®´Â°ÅÁÒ. ¾Æ·¡¿¡ ¹Ù·Î ±× ¿¹¸¦ µé°Ú½À´Ï´Ù. [Áö±Ý±îÁöÀÇ ¹æ½Ä] [¾²·¹µå »ç¿ë] void main() unsigned long Thread( void *arg ) { { WSAStartUp() while( 1 ) socket(); { bind() accept(); listen() Á¢¼Ó¿¡ ´ëÇÑ Ã³¸®; } accept() //¹«ÀÛÁ¤ ±â´Ù¸². } closesocket(); void main() WSACleanup(); { } WSAStartUp(); socket(); bind(); listend(); Createthread( Thread ); ¼­¹ö¿¡ °ü·ÃµÈ ÇÁ·Î±×·¥À» ÁøÇà. } Áö±ÝÀº ¾²·¹µå¾È¿¡ Á¢¼Ó¿¡ °üÇÑ ºÎºÐ¸¸ Àֱ⠶§¹®¿¡ ¾µ¸ð ¾ø¾î º¸ÀÏÁöµµ ¸ð¸¨´Ï´Ù ¸¸, Àú ¾²·¹µå¾È¿¡ ¼ÒÄÏÀÌ ´ÝÈú¶§, µ¥ÀÌÅÍ°¡ ¿ÔÀ»¶§µî¿¡ ´ëÇÑ Ã³¸®±îÁö ³Ö¾îµÎ¸é »óȲÀÌ ´Þ¶óÁö°ÚÁÒ? ^^; ¹Ù·Î ´ÙÀ½ °Ô½Ã¹°¿¡¼­ ´Ù·ê ³»¿ëÀÔ´Ï´Ù. ´ÙÀ½ ½Ã°£¿£ ¾²·¹µå ¾È¿¡ µé¾î°¥ ³»¿ëµéÀ» Á» ´õ ±¸Ã¼ÀûÀ¸·Î º¸°Ú½À´Ï´Ù. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #06 ÁöÀºÀÌ : Á¤ÇöÈ£ * Áö±Ý±îÁö´Â Ŭ¶óÀ̾ðÆ®/¼­¹öÀÇ ÃʱâÈ­¹× ¿¬°á±îÁö¸¦ ´Ù·ç¾ú½À´Ï´Ù. ÀÌÁ¦ ½ÇÁ¦·Î ¿¬°áµÉ µÎ ÇÁ·Î±×·¥ »çÀÌ¿¡ ½ÇÁ¦·Î µ¥ÀÌÅ͸¦ º¸³»µµ·ÏÇÏÁÒ. °£´ÜÈ÷ send/recv¸¸ ¾Ë¸é µÇ±ä ÇÕ´Ï´Ù¸¸, ±×·¸°Ô °£´ÜÇÏÁö¸¸Àº ¾Ê½À´Ï´Ù. ^^; À̹ø Àå¿¡¼­´Â °£´ÜÈ÷ send/recv°¡ ¾î¶»°Ô ¾²ÀÌ´ÂÁö¸¸À» º¾´Ï´Ù. ÄÚµåÀÇ ÀϺθ¦ ¶â¾î ³õÀºµíÇÑ Áï, ´ÜÆí ÀûÀÎ ´À³¦ÀÌ µé±äÇÕ´Ï´Ù¸¸, ½ÇÁ¦·Î äÆà Ŭ¶óÀ̾ðÆ®/¼­¹ö ÇÁ·Î±×·¥À» ¸¸µå´Â ¸¶Áö ¸· ±Û¿¡¼­ ¸ðµç ºÎºÐÀ» ¾Ë°Ô µÉ°ÍÀÔ´Ï´Ù. ±×·¯´Ï ³Ê¹« Á¶±ÞÇÏ°Ô »ý°¢ÇÏÁö ¸¶½Ã°í À̹ø ±ÛÀº send/recv½Ã¿¡ ÆÐŶÀÌ Â©·Á¼­ ¿Ã¶§ ¾î¶»°Ô 󸮸¦ ÇÏ´ÂÁö¿Í send°¡ ºÒ °¡´ÉÇÑ »óȲÀ϶§´Â ¾î¶»°Ô 󸮸¦ ÇÏ´ÂÁöÁ¤µµ¿¡ °ü½ÉÀ» µÎ°í º¸½ÉÀÌ ÁÁÀ»µíÇÕ´Ï´Ù. ¾ÆÁ÷Àº ³×Æ®¿÷ ÇÁ·Î±×·¥À» À§ÇÑ ´ÜÆíÀûÀÎ Áö½ÄÀ» ½×´Â ´Ü°èÀÏ »ÓÀ̶ó´Â Á¡À» Ç×»ó ÀØÁö ¸»¾Æ Áֽʽÿä. ^^; [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *[À̺¥Æ® ¸Þ½ÃÁö¸¦ ¹Þ¾ÆºÁ¿ä~] *[send()/recv()¿Í Å¥] 6. À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ µ¥ÀÌÅÍ ¼Û¼ö½Å. [À̺¥Æ® ¸Þ½ÃÁö¸¦ ¹Þ¾ÆºÁ¿ä~] ÀÌÁ¦ºÎÅÍ´Â Åë½Å»ó¿¡¼­ ¾î¶² ¸Þ½ÃÁö(Á¢¼Ó,²÷±è,Àбâ)°¡ ¹ß»ýÇßÀ»¶§ ±×¿¡ ¸Â´Â ÇÔ ¼ö·Î ´ëÀÀÇÏ´Â ¹æ¹ýÀ» º¸°Ú½À´Ï´Ù. ±× Çü½ÄÀº ¾Æ·¡¿Í °°½À´Ï´Ù. ¿ì¼±Àº Äڵ带 º¸ µµ·Ï ÇÏÁÒ. WSANETWORKEVENTS event; WSAEVENT hRecvEvent = WSACreateEvent(); WSAEventSelect( Socket, hRecvEvent, FD_ACCEPT | FD_READ | FD_CLOSE ); while( 1 ) { Sleep( 10 ); //·çÇÁ°¡ 10/1000ÃÊ¿¡ Çѹø¾¿ µ¿ÀÛÇÕ´Ï´Ù. WSAEnumNetworkEvents( Socket, hRecvEvent, &event); if((event.lNetworkEvents & FD_ACCEPT) == FD_ACCEPT) { accept(); //Á¢¼ÓÀ» ¹Þ¾ÆµéÀÓ. } if((event.lNetworkEvents & FD_READ) == FD_READ) { recv(); //µ¥ÀÌÅ͸¦ ÀоîµéÀÓ. } if((event.lNetworkEvents & FD_CLOSE) == FD_CLOSE) { closesocket( Socket ); //ÇØ´ç ¼ÒÄÏÀÌ ´ÝÇûÀ½. } } ´ë°­ °¨À» ÀâÀ¸½ÅºÐµéÀº Á¢¼Ó, recv¿Í closesocket°ú °ü°èµÈ Áï, µ¥ÀÌÅÍ°¡ ¿Â °æ ¿ì¿Í ¼ÒÄÏÀÌ ´ÝÈù °æ¿ì¿¡ ´ëÇÑ »ç°ÇÀÌ ¹ß»ýÇÑ °æ¿ì¶ó´Â °É ÀÌ¹Ì ´«Ä¡Ã¤¼ÌÀ»Áöµµ... ±×·³ À§¿Í °°ÀÌ ¼ÒÄÏ¿¡ °ü·ÃµÈ ºÎºÐÀÇ Ã³¸®¸¦ ¾îµð¿¡ ³Ö´À³Ä?´Â Áö³­ °Ô½Ã¹° ¸¶Áö ¸·¿¡¼­ acceptºÎºÐÀ» ¾²·¹µå·Î ¶ç¿ü´ø ºÎºÐÀÌ ÁÁÀ»µíÇϱº¿ä. Áï, À§ÀÇ ±¸Á¶´Â Çϳª ÀÇ ¾²·¹µå¾È¿¡ ³Ö¾îµÎ°í Á¢¼Ó, µ¥ÀÌÅÍ ¼ö½Å, ¼ÒÄÏ´ÝÈûÀ» °¨ÁöÇÏ´Â ±â´ÉÀ» °¡Áø ¼Ò ÄÏ°¨½ÃÀÚ°¡ µÇ´Â°Ì´Ï´Ù. ^^; »ç¿ëµÈ ÇÔ¼ö¸¦ º¸µµ·Ï ÇÏÁÒ. WSANETWORKEVENTS event; //³×Æ®¿÷ À̺¥Æ®¸¦ ÀúÀåÇÒ ±¸Á¶Ã¼. WSAEVENT hRecvEvent = WSACreateEvent(); //À©¼Ó À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ÃʱâÈ­ÇÏ°í //±× ÇÚµéÀ» ³Ñ±é´Ï´Ù. //ƯÁ¤¼ÒÄÏ¿¡¼­ ¾ò°í ½ÍÀº À̺¥Æ®¸¦ ¼³Á¤ÇÕ´Ï´Ù. int WSAEventSelect ( SOCKET s, WSAEVENT hEventObject,long lNetworkEvents ); * s : À̺¥Æ®¸¦ ¾ò°í ½ÍÀº ¼ÒÄÏ. * hEventObject : À©¼Ó À̺¥Æ® ¿ÀºêÁ§Æ®ÀÇ ÇÚµé * lNetworkEvents : °¨ÁöÇÏ°í ½ÍÀº ¿ÀºêÁ§Æ®¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¸®ÅÏ°ª : 0 ÀÌ¸é ¿Ã¹Ù·Î µ¿ÀÛÇÑ °Ì´Ï´Ù. //ƯÁ¤ ¼ÒÄÏ¿¡¼­ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö¸¦ ¾Ë¾Æº¾´Ï´Ù. int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ); s : °¨½ÃÇÒ ¼ÒÄÏ hEventObject : À̺¥Æ®¿Í °ü·ÃµÈ ÇÚµé lpNetworkEvents : ¿¡·¯ ±â·ÏÀ̳ª ³×Æ®¿÷¿¡¼­ ¹ß»ýÇÑ À̺¥Æ®(Á¢¼Ó,¼Û¼ö½Å,²÷±èµî )°¡ ÀúÀåµÉ °÷. ¸®ÅÏ°ª : 0 ÀÌ¸é ¿Ã¹Ù·Î µ¿ÀÛÇÑ °Ì´Ï´Ù. [send/recv¿Í Å¥] *send ÀÌ¹Ì ¾Õ °Ô½Ã¹°¿¡¼­ send()ÇÔ¼ö´Â Çѹø ´Ù·éÀûÀÌ ÀÖ½À´Ï´Ù¸¸, º¹½ÀÀ» ÇÏÁÒ. char SendMessage[6] = "Test!"; int SendSize = 6; int ActualSendSize; ActualSendSize = send( ClientSocket, SendMessage, SendSize, 0 ); *recv int ActualRecvSize; char Buffer[999]; //Àû´çÈ÷ Å« ¹öÆÛ¸¦ Àâ¾ÆÁÝ´Ï´Ù. ActualRecvSize = recv( ClientSocket, Buffer, sizeof Buffer, 0 ); À§¿Í °°¾Æ ÇÑÂÊ¿¡¼­ send·Î º¸³»¸é ¹Ý´ëÂÊ¿¡¼­´Â recv·Î ¹ÞÀ¸¸é µË´Ï´Ù. ´ç¿¬ÇÑ °ÅÁÒ. ^^; ÇÑ°¡Áö ÁÖÀÇÇÒ Á¡À̶ó¸é ¿©·¯ºÐ²²¼­ º¸³½ Å©±â¸¸Å­ ²÷°Ü¼­ µ¥ÀÌÅÍ°¡ ¿À Áö´Â ¾Ê´Â´Ù´Â°Ì´Ï´Ù. ¿¹¸¦ º¸ÁÒ. [¼­¹ö] send( 5¹ÙÀÌÆ® ) send( 5¹ÙÀÌÆ® ) send( 10¹ÙÀÌÆ® ) [Ŭ¶óÀ̾ðÆ®] recv( 5¹ÙÀÌÆ® ) recv( 5¹ÙÀÌÆ® ) recv( 10¹ÙÀÌÆ® ) À§¿Í°°Àº Çü½ÄÀÌ ¾Æ´Ï¶ó´Â°ÅÁÒ. ¾î´ÀÁ¤µµÀÇ Å©±â·Î ¸ð¿©¼­ ¿À±â ¶§¹®ÀÔ´Ï´Ù. ¿¹¸¦ µé¸é ¸¸¾à Ŭ¶óÀ̾ðÆ®°¡ 10¹ÙÀÌÆ®¾¿ ¹Þ´Â´Ù¸é... recv( 5¹ÙÀÌÆ® ); ´ÙÀ½ 5¹ÙÀÌÆ®°¡ ¿À±â¸¦ ±â´Ù¸°´Ù. recv( 5¹ÙÀÌÆ® ); 10¹ÙÀÌÆ®°¡ µÇ¾úÀ¸´Ï ¿Â µ¥ÀÌÅ͸¦ ÀÎÁ¤ÇÑ´Ù. recv( 10¹ÙÀÌÆ® ); 10¹ÙÀÌÆ®°¡ µÇ¾úÀ¸´Ï ¿Â µ¥ÀÌÅ͸¦ ÀÎÁ¤ÇÑ´Ù. ¸¸¾à 20¹ÙÀÌÆ®¾¿ ¹Þ´Â´Ù¸é? recv( 5¹ÙÀÌÆ® ) //20¹ÙÀÌÆ®°¡ µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ±â´Ù¸°´Ù. recv( 5¹ÙÀÌÆ® ) //20¹ÙÀÌÆ®°¡ µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ±â´Ù¸°´Ù. recv( 10¹ÙÀÌÆ® ) // 20 ¹ÙÀÌÆ®°¡ µÇ¾úÀ¸¹Ç·Î ±×µ¿¾È ¸ðÀÎ °ªÀ» ÀÎÁ¤ÇÑ´Ù. ¹°·Ð setsockoptÇÔ¼ö¸¦ ÀÌ¿ëÇØ ¿À´Â Á·Á· ¹Þ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ±×¸®°í À§ÀÇ °æ ¿ì°¡ Ç×»ó Àû¿ëµÇ´Â°ÍÀº ¾Æ´Õ´Ï´Ù. ÀÏÁ¾ÀÇ ½Ã°£ ´ÜÀ§·Î ÀÌ·ç¾îÁö´Â °æ¿ì°¡ ´ëºÎºÐ ÀÔ´Ï´Ù. ±×·¯´Ï±î recvÇÔ¼ö°¡ 20¹ÙÀÌÆ®¾¿ ¹Þ´Â ±¸Á¶À϶§ 1¹ÙÀÌÆ®¾¿ 19¹ø º¸³»µµ ¹Ý ÀÀÀÌ ÀüÇô ¾ø´Â³Ä? ±×·¸Áö ¾Ê½À´Ï´Ù. ÁöÁ¤µÈ ½Ã°£³»¿¡ 20¹ÙÀÌÆ®¸¦ ä¿ìÁö ¸øÇϸé, ±×µ¿¾È ¹ÞÀº °ª¸¸À» ÀÎÁ¤ÇØÁÝ´Ï´Ù. Áï send¿Í recv°¡ Ç×»ó 1:1·Î ´ëÀÀµÇÁö ¾Ê´Â »ó ȲÀÌ ¹ß»ýÇϱ⠶§¹®¿¡ º¸³»°í ¹ÞÀ» µ¥ÀÌÅ͸¦ Àӽ÷Πº¸°üÇØ µÎ¾ú´Ù°¡ º¸³»Áִ ť °¡ ÇÊ¿äÇÏ°Ô µÇ´Â°ÅÁÒ. recv¿¡ ´ëÇÑ Å¥¸¦ ¾î¶»°Ô ó¸®ÇÏ´ÂÁö ¾Æ·¡¸¦ º¸µµ·ÏÇÏÁÒ. Å¥¸¦ ¸¸µå´Â ¹æ¹ýµµ ¿©·¯°¡Áö°¡ ÀÖ°ÚÁÒ. ¾Æ·¡¿¡ Á¦°¡ ¸¸µç ¹æ¹ý¸»°í ´Ù¸¥ ¹æ¹ýÀ» »ý°¢ÇØ º¸½Éµµ ÁÁ°ÚÁÒ. ^^; unsigned long __stdcall ChannelManagementThread( void *arg ) { char Buffer[80]; //Å¥¸¦ À§ÇÑ ¹è¿­ Àû´çÈ÷ Å©°Ô Àâ¾ÆµÐ´Ù. char Queue[999]; //ÇöÀç Å¥ ¾È¿¡¼­ÀÇ ½ÃÀÛÁ¡(À§Ä¡). unsigned short QueuePosition = 0; int retval; //Å¥¸¦ ÃʱâÈ­ÇÑ´Ù. memset( Queue, 0, 999 ); //³×Æ®¿÷ À̺¥Æ®¸¦ À§ÇÑ ±âº»¼³Á¤. WSANETWORKEVENTS event; WSAEVENT hRecvEvent = WSACreateEvent(); while( 1 ) { Sleep( 1 ); //À̺¥Æ®¸¦ ÃʱâÈ­ÇÑ´Ù. memset( &event, 0, sizeof event ); //¼ÒÄÏ¿¡¼­ ¾ò°í ½ÍÀº À̺¥Æ®¸¦ ÃʱâȯÇÑ´Ù. WSAEventSelect( Socket, hRecvEvent, FD_READ ); //¼ÒÄÏ¿¡¼­ ¹ß»ýÇÑ À̺¥Æ®¸¦ ¾ò¾î³½´Ù. WSAEnumNetworkEvents( PlayerSocket, hRecvEvent, &event); //¹º°¡ ÀÐÀ»°Ô ÀÖÀ¸¸é? Áï, recvÇÔ¼ö¸¦ ½ÇÇàÇؾßÇϸé? if((event.lNetworkEvents & FD_READ) == FD_READ) { //µ¥ÀÌÅ͸¦ Àо´Ù. ½ÇÁ¦ ¸î ¹ÙÀÌÆ®¸¦ Àоú´ÂÁö retval¿¡ //ÀúÀåÇÑ´Ù. retval = recv( Socket, Buffer, sizeof Buffer, 0 ); //¹º°¡ ÀÐÀº°Ô ÀÖÀ¸¸é? if( retval > 0 ) { unsigned short Size; memcpy( &Queue[QueuePosition], Buffer, retval ); QueuePosition += retval; while( 1 ) { //¾Æ·¡´Â ÆÐŶÀÇ Å©±â¸¦ Àо´Â°Ì´Ï´Ù. µ¥ÀÌÅ͸¦ º¸³¾¶§ ¸Ç //¾Õ 2¹ÙÀÌÆ®¿¡ ÀÐÀ» Àüü µ¥ÀÌÅÍÀÇ Å©±â¸¦ º¸³»´Â°ÅÁÒ. ¾Õ¿¡ //2¹ÙÀÌÆ®¿¡ ÆÐŶ Àüü »çÀÌÁ º¸³»´Â ºÎºÐÀº ÇÁ·ÎÅäÄÝ¿¡ //´ëÇؼ­ ¾ð±ÞÇÒ¶§ ´Ù½Ã º¸µµ·Ï ÇÏÁÒ. Áö±ÝÀº ±×³É ³Ñ¾î°¡¿ä~ memcpy( &Size, &Queue[0], 2 ); //½ÇÁ¦ ÆÐŶũ±â¸¸Å­ Àоú´Ù¸é? if( QueuePosition >= Size ) { char *Message, ReturnMessage; Message = (char *)malloc( Size ); memcpy( Message, &Queue[0], Size ); //¹ÞÀº µ¥ÀÌÅ͸¦ ÀÎÁ¤ÇÏ°í ±×¿¡ µû¸¥ 󸮸¦ÇÑ´Ù. QueuePosition-=Size; memcpy( &Queue[0], &Queue[Size], QueuePosition ); free( Message ); } else break; } } } } WSACloseEvent( hRecvEvent ); ExitThread( 1 ); } ÈÞ¿ì.... ´ÜÁö, ¹Þ±âÇϳª¿¡ ´ëÇÑ Å¥ ó¸®Àε¥ Á© ±æ±º¿ä. À§ÀÇ ¿¹µµ ¹¹ ±×¸® ÁÁÀº °Ç ¾Æ´Õ´Ï´Ù¸¸, Âü°íÇÏ½Ã°í ´õ ÁÁÀº ¹æ¹ýÀ» »ý°¢ÇØ º¸½Éµµ ÁÁ°ÚÁÒ. ^^; sendµµ ºñ½ÁÇÕ´Ï´Ù¸¸, À§¿Í´Â Á¶±Ý ´Ù¸¨´Ï´Ù. ¾ðÁ¦ ¹ÞÀ»Áö ¸ð¸£´Â °æ¿ìÇÏ°í ¾ðÁ¦ º¸³¾Áö¸¦ È®½ÇÈ÷ ¾Æ´Â °æ¿ì´Â ´ç¿¬È÷ ´Ù¸¨´Ï´Ù. »ý°¢ÇØ º¸¸é ¿©·¯°¡Áö ¹æ¹ýÀÌ ÀÖ°Ú ÁÒ? ÇöÀç»óÅ°¡ Àü¼Û °¡´ÉÇÑ »óÅÂÀÎÁö¸¦ °¨ÁöÇÏ°í Àü¼Û °¡´ÉÇÏ¸é º¸³»´Â°ÅÁÒ. ±×·¸ Áö ¾ÊÀ»½Ã¿¡´Â µ¥ÀÌÅ͸¦ Å¥¿¡ ÀúÀåÇØ µÎ¾ú´Ù°¡ Àü¼ÛÀÌ °¡´ÉÇØÁø ½ÃÁ¡ºÎÅÍ Å¥¿¡¼­ µ¥ÀÌÅ͸¦ Àо¼­ º¸³»ÁÖ´Â °Íµµ ÇϳªÀÇ ¹æ¹ýÀÌ µÉ°Ì´Ï´Ù. ¾Õ¿¡¼­µµ À̾߱âÇßÁö¸¸ , send/recv ÇÔ¼ö°¡ 1:1 ´ëÀÀµÇ´Â °Íµµ ¾Æ´Ï°í ¿øÇÏ´Â ¸¸Å­ÀÌ º¸³»Áö´Â °æ¿ì°¡ ¾Æ ´Ò¶§µµ ÀÖ½À´Ï´Ù. sendÀÇ °æ¿ì´Â ¾Æ·¡¿Í °°À̸¸ ÇØÁ൵ ¿øÇÏ´Â ¸¸Å­À» º¸³»ÁÙ¼ö´Â ÀÖÀ»°Ì´Ï´Ù. ÇÏÁö¸¸ Àü¼Û °¡´ÉÇÑ »óÅÂÀÎÁö¸¦ È®ÀÎÇØ ÁÖ¸é ´õ ¿Ïº®ÇØ Áú°Ì´Ï´Ù. bool SendData( char *SendBuffer, int SendBufferSize, int timeout ) { int StartTime; int CurrentTime; int SendedDataSize = 0; StartTime = timeGetTime(); while( SendedDataSize <= SendBufferSize ) { CurrentTime = timeGetTime(); SendedBufferSize += send( SendBuffer, SendBufferSize, 0 ); if( CurrentTime-StartTime < timeout ) { return false; } } return true; } À§ÀÇ °æ¿ì´Â ¿øÇÏ´Â ¸¸Å­ ¿øÇÏ´Â ½Ã°£¾È¿¡ º¸³Â´ÂÁö¸¦ È®ÀÎÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. °¡´É Çϸé, ÇöÀç°¡ send°¡´ÉÇÑ »óȲÀÎÁöµµ ÆľÇÇؼ­ »ý°¢ÇÏ°í sendÅ¥¿¡ ±× µ¥ÀÌÅ͸¦ ³Ö ¾îµÎ´Â °Íµµ ¹æ¹ýÀÔ´Ï´Ù. óÀ½ºÎÅÍ Àü¼ÛÀÌ °¡´ÉÇÑÁö ¾Ë°í ÀÖ´Ù¸é ±»ÀÌ send¸¦ È£Ãâ ÇÏÁö ¾Ê¾Æµµ µÇ±â ¶§¹®ÀÌÁÒ. ^^; ¹¹ ±×°Ç ¿©·¯ºÐµé²²¼­ ¼³°èÇϱ⠳ª¸§ÀÔ´Ï´Ù. º¸Åë sendÈÄ ´Ù¸¥ ¼ÒÄÏ ÀÛ¾÷¶§¹®¿¡ Àü¼ÛÀÌ ºÒ°¡´ÉÇÑ °æ¿ì´Â sendÇÔ¼ö¿¡¼­ ¸®ÅϵǴ °ªÀº ´ç¿¬È÷ SOCKET_ERRORÁÒ. WSAGetLastError()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ¾î¶² ¿¡·¯¿´´ÂÁö¸¦ ÆÇ´ÜÇØ º¾´Ï´Ù. ±× °ªÀÌ WSAEWOULDBLOCK(¿¡·¯¶ó±â º¸´Ù´Â °æ°íÁÒ. ÇÔ¼ö°¡ È£ÃâµÈ ¼ø°£¿¡ Áï½Ã ¼öÇàÀÌ ºÒ°¡´ÉÇØ µÚ·Î ¹Ð¸° °æ¿ì¶ó°í º¸½Ã¸é µË´Ï´Ù.)ÀÌ¸é ´Ù½Ã ±â´Ù ·Á º¸¸é µÇ°í ±×·¸Áö ¾ÊÀ»½Ã¿£ °ÅÀÇ ¿¬°áÀÌ ²÷±ä °æ¿ì¶ó°í º¸¸é µË´Ï´Ù¸¸, ¿¡·¯ÄÚ µå¿¡ µû¸¥ 󸮸¦ ÀûÀýÈ÷ ÇØ ÁÖ¼Å¾ß µÇ°ÚÁÒ? ¸¸¾à Áï½Ã ¼öÇàÀÌ ºÒ°¡´ÉÇØ µÚ·Î ¹Ð¸° °æ¿ì¶ó¸é, if((event.lNetworkEvents & FD_WRITE) == FD_WRITE)ºÎºÐ¸¦ ³×Æ®¿÷ À̺¥ Æ® °ü¸®ÀÚ¿¡ Ãß°¡Çϼż­ Àü¼ÛÀÌ °¡´ÉÇØÁø ½ÃÁ¡À» ¾Ë¾Æ³»°í ±×¶§ ¿©·¯ºÐ²²¼­ ¸¸µç send Å¥¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ÀüºÎ º¸³»¹ö¸®¸é µÇ°ÚÁÒ. ^^; À§ÀÇ Time-Out°³³äÀº º¸´Ù ´Â ÀÌ ¹æ¹ýÀÌ ´õ Á÷°üÀûÀÌ°í À¯¸®ÇÒµí ÇÕ´Ï´Ù. ½ÇÁ¦ ÀÌ¿¡ ´ëÇÑ ¿¹´Â ¸¶Áö¸· ±ÛÀÌ µÉ äÆà Ŭ¶óÀ̾ðÆ®/¼­¹ö ÇÁ·Î±×·¥ Á¦ÀÛ¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°Ô µË´Ï´Ù. ¿¹¸¦ º¸ÁÒ. void SendData( .., .. ) { int Result; Result = send(); if( Result == SOCKET_ERROR ) { if( WSAGetLastError() == WSAEWOULDBLOCK ) { //Å¥¿¡ µ¥ÀÌÅ͸¦ ³Ö¾îµÎ°í ³ªÁß¿¡ ´Ù½Ã º¸³À´Ï´Ù. } else { //¿¬°áÀ» Á¾·áÇÕ´Ï´Ù. } } } send´Â À§ÀÇ µÎ°¡Áö ¿øÄ¢¸¸ Àß ÁöŲ´Ù¸é Å« ¹«¸®¾øÀÌ ¼öÇàµÉ°Ì´Ï´Ù. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #07 ÁöÀºÀÌ : Á¤ÇöÈ£ * ÀÌÀü °­Á±îÁö Àß Àоî¿À½ÅºÐµéÀ̶ó¸é, ±âº»ÀûÀÎ ¿¬°áó¸®¹× µ¥ÀÌÅÍÀÇ ¼Û¼ö½Åó ¸®±îÁö´Â µÇ¾úÀ»°Ì´Ï´Ù. Áö±Ý±îÁö »ç¿ëµÈ Àü¼Û¿¡ °üÇÑ Ã³¸®¸¦ À§ÇÑ ÇÁ·ÎÅäÄÝÀº TC P¿´½À´Ï´Ù. °ÅÀÇ µðÆúÆ®¿´ÁÒ. À̹ø Àå¿¡¼­ ´Ù·ç°Ô µÉ ³»¿ëÀº UDP¿Í TCPÀÇ ´Ù¸¥Á¡ Á¤µµ¿Í ½ÇÁ¦ ÇÁ·Î±×·¥½Ã ´Þ¸® ó¸®ÇØ¾ß ÇÏ´Â ºÎºÐµé Á¤µµ ÀÔ´Ï´Ù. [¿¹Á¦ÄÚµå ÇÁ·ÎÁ§Æ® ±¸¼º¹× »ç¿ë¹ý] ÀÌ °Ô½Ã¹°¿¡ °üÇÑ ¿¹Á¦´Â Network\UDP\Server,Network\UDP\Client¿¡ ÀÖ½À´Ï´Ù. ÇÁ·ÎÁ§Æ®¿¡ ws2_32.lib wsock32.lib ÆÄÀÏÀ» ÀçÁ¤ÀÇ ÇϼžßÇÕ´Ï´Ù. »ç¿ë¹ý] server ¼­¹öÀÇIPÁÖ¼Ò ¼­¹öÀÇÆ÷Æ®¹øÈ£ »ç¿ë¹ý client ¼­¹öÀÇIP ¼­¹öÀÇÆ÷Æ® Ŭ¶óÀ̾ðÆ®ÀÇIP Ŭ¶óÀ̾ðÆ®ÀÇÆ÷Æ® ¸¸ÀÏ ÀÚ½ÅÀÇ IP°¡ 111.222.111.222¶ó¸é. server 111.222.111.222 5001 client 111.222.111.222 5001 111.222.111.222 5002 À§¿Í°°ÀÌÇÏ¸é µË´Ï´Ù. [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *[UDP¶õ? TCP¿ÍÀÇ Â÷ÀÌÁ¡Àº??] *[UDP·Î ¼³Á¤À» ÇØ¿ä~] *[sendto/recvfrom] 7. TCP¿Í UDPÀÇ Â÷ÀÌÁ¡. [UDP¶õ? TCP¿ÍÀÇ Â÷ÀÌÁ¡Àº??] User Daragram ProtocolÀÇ ¾àÀÚÁÒ. À©µµ¿ì ¼ÒÄÏ¿¡¼­ »ç¿ëµÇ´Â ´ëÇ¥ÀûÀÎ ÇÁ·ÎÅäÄÝ ·Î¼­ TCP¿Í´Â ¸î°¡Áö Â÷ÀÌÁ¡ÀÌ ÀÖ½À´Ï´Ù¸¸ Å©°Ô ´Ù¸¥Á¡Àº ¾ø½À´Ï´Ù. ¿ì¼± °¡Àå Å©°Ô ´Ù¸¥Á¡À̶ó¸é, ù°, UDP´Â TCP¿Í ´Þ¸® µ¥ÀÌÅÍÀÇ ¼ö½Å¿¡ ´ëÇÑ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Áï, º¸³ÂÁö ¸¸ ¸ø ¹ÞÀ» °æ¿ì°¡ »ý±æ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ Àü¼Û ¼ø¼­°¡ ¹Ù²ð¼öµµ ÀÖ½À´Ï´Ù. µÑ°, Çì´õÀÇ Å©±â°¡ ´Ü 8¹ÙÀÌÆ®ÀÔ´Ï´Ù. TCP°¡ 20-24¹ÙÀÌÆ®·Î ¾Ë°í ÀÖ½À´Ï´Ù. ¼Â°, ÆÐŶ ´ÜÆíÈ­°¡ ¾ø½À´Ï´Ù. Çϳª Çϳª ÀÚ¼¼È÷ ¼³¸íÇغ¸ÁÒ. ¿ì¼± µ¥ÀÌÅÍÀÇ Á¤È®ÇÑ ¼ö½Å¿¡ ´ëÇÑ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù. Áï, µ¥ÀÌÅÍ°¡ ¾Æ¿¹ °¡ Áö ¾ÊÀ» °æ¿ìµµ ÀÖ°í, µ¥ÀÌÅÍÀÇ ¼ø¼­°¡ µÚ¹Ù²î¾î ¿Ã¼öµµ ÀÖ½À´Ï´Ù. °£´ÜÇÑ ¿¹¸¦ µé ¸é....... TCP´Â ÀüÈ­¿Í °°°í UDP´Â ¼ÒÆ÷¿Í °°½À´Ï´Ù. ÀüÈ­´Â »ó´ë¿Í À̾߱⸦ ÇÏ °íÀÚÇÒ¶§ ÀüÈ­¸¦ °É°í ±× »ç¶÷ÀÎÁö È®ÀÎÀ» ÇÏ°í ³»¿ëÀ» ÀüÇÕ´Ï´Ù. ¹Ý¸é UDP´Â ¼ÒÆ÷ ¿Í °°¾Æ¼­ ¿ìü±¹ »çÁ¤¿¡ µû¶ó¼­ ´Ê°Ô º¸³½ ¹°°ÇÀÌ»¡¸® µµÂøÇϰųª ¸ÕÀú º¸³½ ¹°°Ç ÀÌ ³ªÁß¿¡µµÂøÇÏ´Â °æ¿ìµµ ÀÖÁÒ. µû¶ó¼­ UDP ÆÐŶ¿¡´Â ¸Þ½ÃÁöÀÇ ¼ø¼­¿¡ °üÇÑ ºÎºÐ ±îÁö ³Ö¾îÁÖ°í ¼ø¼­¸¦ º¸Á¤ÇØ ÁÖ¾î¾ßÇÏÁö ¾ÊÀ»±î ½Í½À´Ï´Ù. »Ó¸¸ ¾Æ´Ï¶ó ¿î¼ÛµµÁß ¿¡ ºÐ½ÇµÉ °æ¿ìµµ ÀÖ´Ù°í ÇÕ´Ï´Ù¸¸, °³ÀÎÀûÀ¸·Î ÇÁ·Î±×·¥À» Çϱ⿡ Ä¡¸íÀûÀÏ Á¤µµ ·Î ¾Ê¿À´Â °æ¿ì´Â ¾ø¾ú´ø°Í °°½À´Ï´Ù. ´ëºÎºÐ ¹Þ¾Ò´ø°Í °°Àº ´À³¦ÀÔ´Ï´Ù. ^^; ÆÐŶÀÇ Çì´õ Å©±â°¡ ÀÛ´Ù´Â Á¡Àº ¾ÆÁÖ Áß¿äÇÕ´Ï´Ù. Áï, TCPÀÇ °æ¿ì¿¡ 1¹ÙÀÌÆ®¸¦ º¸³½´Ù¸é ±× Å©±â¿¡ Çì´õ(¼Û¼ö½ÅÀ§Ä¡¹× ¿É¼Çµé)Å©±â¸¦ ´õÇؼ­ 21-25¹ÙÀÌÆ®°¡ µÇ´Â ¼ÀÀÌÁÒ. ´Ü 1¹ÙÀÌÆ®Áö¸¸ Áö¼ÓÀûÀ¸·Î º¸³»¾ßÇÏ´Â °æ¿ì¿£ Å« ºÎ´ãÀ̵˴ϴÙ. ÇÏÁö¸¸, UDP´Â Çì´õ°¡ ´Ü 8¹ÙÀÌÆ®»ÓÀÔ´Ï´Ù. ÆÐŶ ´ÜÆíÈ­°¡ ¾ø´Ù´Â À̾߱â´Â ¾Õ¿¡¼­ send/recvÇÔ¼ö¸¦ »ç¿ëÇϱâ À§ÇØ Å¥¸¦ ¸¸µé ¾ú¾úÁÒ? ÆÐŶÀ» º¸³¾¶§ send/recv°¡ 1:1·Î ´ëÀÀµÇ´Â°Ô ¾Æ´Ï¶ó Àû´çÇÑ Å©±â·Î ²÷°Ü ¿À±â¿¡ Å¥¸¦ ¸¸µé¾ú¾ú½À´Ï´Ù. ÇÏÁö¸¸ UDP¿¡´Â ÀÌ ÀÛ¾÷ÀÌ ÇÊ¿ä¾ø½À´Ï´Ù. sendto/ recvformÇÔ¼ö°¡ °¢°¢ 1:1·Î ´ëÀÀÀ» µÈ´Ù´Â »ç½ÇÀÌ ¹àÇôÁö´Â±º¿ä. ´ç¿¬ÇÑ À̾߱â°Ú Áö¸¸, ÆÐŶÀÇ ¼ø¼­°¡ µÚ¹Ù²î¾î ¿ÃÁöµµ ¸ð¸£´Âµ¥, ÆÐŶ±îÁö Àß·Á¼­ ¿Â´Ù¸é...... ^^ TCP¿Í ºñ±³ÇßÀ»¶§ ³ª¸§´ë·Î Àå´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. À§ÀÇ ³»¿ëµéÀ» Àß ºÐ¼®ÇØ º¸½Ã¸é ÇÑ°¡Áö °á·ÐÀÌ ³ª¿Ã°Ì´Ï´Ù. ±×°Ç ¹Ù·Î!! ÀÚÁÖº¸³»¾ßÇÏ´Â µ¥ÀÌÅÍ¿¡´Â UDP¸¦ ¾´´Ù. ¾î¼´Ù°¡ Çѵιø ÀÒ¾î¹ö·Áµµ »ó°ü¾ø´Â µ¥ÀÌÅÍ´Â UDP·Î º¸³½´Ù. ¹Ý¸é, Áß¿äÇÑ µ¥ÀÌ ÅÍ´Â TCP·Î º¸³½´Ù. ÀÌ·± °á°ú°¡ ³ª¿À´Â±º¿ä. ^^; [UDP·Î ¼³Á¤À» ÇØ¿ä~] ±âÁ¸ÀÇ TCP¼³Á¤ : socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); »õ·Î¿î UDP¼³Á¤ : socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); À§ÀÇ ¼³Á¤ÀÌ ÀüºÎÀÔ´Ï´Ù. ^^; [ÇÁ·Î±×·¥ ±¸Á¶´Â ¾î¶»°Ô ¹Ù²î³ª¿ä?] ºñ±³¸¦ ½±°Ô ÇϱâÀ§ÇØ ±âÁ¸ÀÇ TCP±¸Á¶¿Í »õ·Î¿î UDP±¸Á¶¸¦ ¿¬¼ÓÀûÀ¸·Î ±×·Á³»°Ú½À ´Ï´Ù. ~TCP ó¸® ¹æ½Ä -¼­¹ö- -Ŭ¶óÀ̾ðÆ®- WSAStartup(); WSAStartup(); socket(); socket(); bind(); bind(); listen(); ¿¬°á È®¸³ accept(); <--------------------> connect(); ¼Û½Å/¼ö½Å send() / recv() <------------> send()/recv(); closesocket(); closesocket(); WSACleanup(); WSACleanup(); ~UDP ó¸® ¹æ½Ä -¼­¹ö- -Ŭ¶óÀ̾ðÆ®- WSAStartup(); WSAStartup(); socket(); socket(); bind(); bind(); ¼Û½Å/¼ö½Å sendto()/recvfrom() <----------> sendto()/recvform() closesocket(); closesocket(); WSACleanup(); WSACleanup(); ´ëºÎºÐÀÇ ±¸Á¶³ª ÇÔ¼öµéÀÌ ÀÌÀü¿¡ TCP·Î ¿©·¯ºÐµé°ú ±¸ÇöÇؿ°Ͱú Å©°Ô ´Ù¸¦°Ô ¾ø ½À´Ï´Ù. ´ÜÁö, socketÇÔ¼ö ¼³Á¤½Ã µé¾î°¡´Â ÀÎÀÚ°¡ ¹Ù²î¾ú´Ù´Â Á¡ ÇϳªÇÏ°í send/ recv°¡ sendto/recvfromÀ̶ó´Â ÇÔ¼ö·Î ´ëüµÇ¾úÀ»»ÓÀÔ´Ï´Ù. [sendto/recvfrom] int sendto( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen ); s : ¼ÒÄÏ buf : º¸³¾ µ¥ÀÌÅÍ°¡ ÀúÀåµÈ ¹öÆÛ. len : º¸³¾ µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ® Å©±â. flags : Ç÷¡±×(¿É¼Ç). to : µ¥ÀÌÅ͸¦ º¸³¾ °÷ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÑ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ. tolen : µ¥ÀÌÅ͸¦ º¸³¾ °÷ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÑ ±¸Á¶Ã¼ÀÇ ¹ÙÀÌÆ® Å©±â. int recvfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen ); s : ¼ÒÄÏ buf : ¹ÞÀº µ¥ÀÌÅÍ°¡ ÀúÀåµÉ ¹öÆÛ. len : ¹ÞÀº µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ® Å©±â. flags : Ç÷¡±×(¿É¼Ç). from : µ¥ÀÌÅ͸¦ º¸³½ °÷ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÒ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ. fromlen : µ¥ÀÌÅ͸¦ º¸³½ °÷ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÒ ±¸Á¶Ã¼ÀÇ ¹ÙÀÌÆ® Å©±â. ¾Æ·¡ÀÇ ÄÚµåµéÀÌ µµ¿òÀÌ µÇ°Ú±º¿ä. struct sockaddr_in ServerAddress; unsigned short ServerPort; //IPÁÖ¼Ò°ª. INADDR_ANY´Â »ç¿ë°¡´ÉÇÑ IP ¾Æ¹«°Å³ª ÀÔ´Ï´Ù. ^^; ServerAddress.sin_family = AF_INET; ServerAddress.sin_addr.s_addr = inet_addr( "ƯÁ¤ IPÁÖ¼Ò" ); //IPÁÖ¼Ò ServerAddress.sin_port = htons( ServerPort = "ƯÁ¤ Æ÷Æ®¹øÈ£") ); //Æ÷Æ®¹øÈ£ char Buffer[80]; int BufferSize=80; int AddressSize = sizeof( ServerAddress ); int RecvSize = 0; memset( Buffer, 0, sizeof Buffer ); sendto( ClientSocket, "Client Message", 15, 0, (struct sockaddr *)&ServerAddress, AddressSize ); RecvSize = recvfrom( ClientSocket, Buffer, BufferSize, 0, (struct sockaddr *)&ServerAddress, &AddressSize ); printf( "¹ÞÀº ¸Þ½ÃÁö : %s, ¹ÞÀº ¸Þ½ÃÁö Å©±â : %d\n", Buffer, RecvSize ); ±âÁ¸¿¡ »ç¿ëÇÏ´ø send/recv ¹æ½Äµé°ú Å©°Ô ´Ù¸¦°Ô ¾ø½À´Ï´Ù. ´ÜÁö »ç¿ëÇÏ´ø ÇÔ¼ö ÀÇ À̸§ÀÌ ¹Ù²î¾ú°í ±× ÀÎÀÚ°¡ ¹Ù²î¾úÀ» »ÓÀÔ´Ï´Ù. Á¤¸®ÇÏÀÚ¸é socketÇÔ¼öÀÇ ÀÎÀÚ °¡ ¹Ù²ïÁ¡°ú send/recv´ë½Å sendto/recvformÀ» »ç¿ëÇÑ´Ù´Â Á¡»ÓÀÔ´Ï´Ù. ¼ÒÄÏ Ãʱâ È­ÀÇ ¼ø¼­°¡ Á» ´Þ¶óÁ³´Ù´Â Á¡ÇÏ°í¿ä. ^^; ½ÇÁ¦ ÄÚµåµéÀ» º¸¸é¼­ ±×¸®°í Âü°í ¹®¼­µéÀ» º¸¸é¼­ Á¤¸®¸¦ ÇØ º¸½Ã¸é Â÷ÀÌÁ¡À» ¾î·ÆÁö ¾Ê°Ô ã¾Æ³¾ ¼ö ÀÖÀ»°Ì´Ï´Ù. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #08 ÁöÀºÀÌ : Á¤ÇöÈ£ * ÀÌÀü±îÁö´Â ´ÜÁö º¸³»°í ¹Þ´Â ¹æ¹ý¿¡ ´ëÇؼ­¸¸ ¾ð±ÞÀÌ ÀÖ¾ú½À´Ï´Ù. À̹ø¿¡´Â ±× º¸³»Áö´Â ³»¿ëÀ» ¾î¶»°Ô ¼³°èÇؾßÇÏ´ÂÁö¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·ÏÇÏÁÒ. [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *[ÇÁ·ÎÅäÄÝ°ú ¼³°è] *[¾Ïȣȭ] *[¾ÐÃàÈ­] [ÇÁ·ÎÅäÄÝ°ú ¼³°è] ProtocolÀº °£´ÜÈ÷ ¸»ÇØ Åë½Å ±Ô¾àÀÔ´Ï´Ù. ¼Û¼ö½ÅÀÚ ¾çÂÊ¿¡¼­ ¾î¶² Á¤ÇØÁø ¾à¼Ó ¿¡ ÀÇÇØ µ¥ÀÌÅ͸¦ º¸³»°í ¹Þ´Â°ÅÁÒ. ¾î¶² ¿¹°¡ ÁÁÀ»±î¿ä? ÀüÈ­¸¦ ¿¹·Î µç´Ù¸é, Àü È­¸¦ °É±â À§Çؼ­ ÁöÄÑ¾ß ÇÏ´Â ¸î°¡Áö ±Ô¾àÀÌ ÀÖ½À´Ï´Ù. * ´Ù¸¥ Áö¿ª¿¡ ÀÖ´Â »ç¶÷À̶ó¸é ÀüÈ­ ¹øÈ£ ¾Õ¿¡ Áö¿ª¹øÈ£¸¦ ³Ö°í ±×·¸Áö ¾ÊÀ¸¸é Áö¿ª¹øÈ£°¡ ÇÊ¿ä¾ø´Ù. * ÀüÈ­¹øÈ£´Â ¼ýÀڷθ¸ ÀÌ·ç¾îÁø´Ù. * ƯÁ¤ÇÑ ÀüÈ­¹øÈ£(112,114,119µî)´Â ÀÌ¹Ì ¿¹¾àµÇ¾î ÀÖ´Ù. µîµî...... À§¿Í°°Àº ¸ðµÎ°¡ ¾Ë°í ÀÖ°í, ÁöÄѾ߸¸ Åë½ÅÀÌ °¡´ÉÇÑ »çÇ×µéÀÌ ÀÖ½À´Ï´Ù. ÀÌ·±°Í µéÀ» ¹Ù·Î ÇÁ·ÎÅäÄÝÀ̶ó°í »ý°¢ÇÏ½Ã¸é °£´ÜÇÒ°Ì´Ï´Ù. ÀÌÁ¦ ¿©·¯ºÐ°ú Àúµµ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â ºÎºÐ¿¡ ´ëÇÑ ¹®Á¦´Â ¾î´ÀÁ¤µµ ÇØ°áÀÌ µÈ »óÅÂÀÔ´Ï´Ù. ÀÌÁ¦´Â ±× µ¥ÀÌÅ͸¦ ¾î¶»°Ô ÁÖ°í ¹ÞÀ»Áö¿¡ ´ëÇÑ ¼³°è¸¦ ÇؾßÇÒ¶§°¡ µÇ ¾ú½À´Ï´Ù. ¿ì¼±Àº Á¦°¡ ¾²´ø ¹æ½ÄÀ» ¾Æ·¡¿¡ ±â¼úÇÏ°Ú½À´Ï´Ù. ½ÇÁ¦·Î ¾Æ·¡ÀÇ ¹æ½ÄÀº Àú ¸»°íµµ ´Ù¸¥ °³¹ßÀڵ鵵 ¸¹ÀÌ »ç¿ëÇÏ´Â ±âº» ±¸Á¶¶ó°í ¾Ë°í ÀÖ½À´Ï´Ù. ?¹ÙÀÌÆ® : ÆÐŶÀÇ Àüüũ±â( ?¹ÙÀÌÆ®+?¹ÙÀÌÆ®+(³ª¸ÓÁö+?) ) ?¹ÙÀÌÆ® : ÆÐŶÀÇ ¼º°Ý ³ª¸ÓÁö+? : ÆÐŶÀÇ ³»¿ë. Àú´Â À§¿Í °°Àº ÇüÅ·Πµ¥ÀÌÅ͸¦ º¸³À´Ï´Ù. TCPÀÇ °æ¿ì ÆÐŶÀÌ Àß·Á¼­ µµÂøÀ» ÇÏ´Â °æ¿ì°¡ Àֱ⠶§¹®¿¡ óÀ½¿£ Àüü Å©±â¸¦ ³Ö¾î recvÇÔ¼ö°¡ Àоî¾ß ÇÒ Àüü Å©±â¸¦ Á¤ÇÕ´Ï´Ù. ´ÙÀ½Àº ±× ÆÐŶÀÇ ¼º°ÝÀ» º¸³À´Ï´Ù. ¿¹¸¦ µé¸é 1Àº Æнº¿öµå. 2´Â °ø°Ý ½ÅÈ£ ÀÌ·±½ÄÀÌÁÒ. ±× µÚ¿¡ ºÙÀº µ¥ÀÌÅÍ´Â ½ÇÁ¦ µ¥ÀÌÅÍÀÔ´Ï´Ù. ½ÇÁ¦ Æнº¿öµå³ª °ø °Ý ½ÅÈ£ÀÏ °æ¿ì¿£ ´©°¡ ´©±¸¿¡°Ô ¸îÀÇ µ¥¹ÌÁö¸¦ ÀÔÇû´ÂÁö? ÀÌ·±½ÄÀÔ´Ï´Ù. À§ÀÇ ¹æ½ÄÀº Áö±ØÈ÷ ´Ü¼øÇÑ ¹æ¹ýÀÔ´Ï´Ù. ¸î°¡Áö¸¦ ´õ Ãß°¡ÇØ¾ß Çϴµ¥ ±×°ÍÀº ¿© ·¯ºÐµéÀÇ ¸òÀÔ´Ï´Ù. °£´ÜÈ÷ »ý°¢ÇØ ³¾ ¼ö ÀÖ´Â ¹æ¹ýÀº ¾Ïȣȭ¿Í ¾ÐÃàÀÏ °ÍÀÔ´Ï´Ù. [¾Ïȣȭ] ¾Ïȣȭµµ µûÁö¸é ²Ï ´Ù¾çÇÑ ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ¿¹¸¦ µéÀÚ¸é ÄÚµå ´ëÁ¶¹ý, ½ÃÇÁÆ®, ƯÁ¤°ª °¡°¨¿¬»êµîµî.... ÄÚµå ´ëÁ¶¹ý : ÄÚµåÇ¥¸¦ º¸°í ¿ø·¡ °ªÀ» ã¾Æ³»´Â ¹æ¹ýÀÔ´Ï´Ù. [ !^^7Q ] ÀÌ¿Í °°Àº Äڵ尡 ÀÖ°í ÄÚµåÇ¥¿¡ ġȯÄڵ尡 Àִ°ÅÁÒ. ! = A ^ = P ^ = P 7 = L Q = E À§¿Í°°ÀÌ Ç®¾î³»´Â ¹æ¹ýÀÔ´Ï´Ù. ½ÃÇÁÆ® : APPLE¸¦ Á¿ì·Î ¸îÄ­ À̵¿ ½ÃÅ°´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. PPLEA, PLEAP, LEAPP, PPLEA¿Í °°ÀÌ¿ä. ƯÁ¤°ª °¡°¨¿¬»ê : ¸» ±×´ë·Î ÄÄÇ»ÅÍ¿¡¼­ »ç¿ëµÇ´Â ¹®ÀÚµéÀÌ »ç½ÇÀº ¼ýÀÚ¶ó´Â »ç½Ç À» ÀÌ¿ëÇÏ´Â °Ì´Ï´Ù. ¿¹¸¦ µé¸é A = 65ÁÒ. ÀÌ°ª¿¡ ?°ªÀ» ´õÇÑ´Ù °Å³ª ?°ªÀ» »«´Ù°Å³ª µîµîÀÇ ¹æ¹ýÀ» ÀÌ¿ëÇؼ­ »õ·Î¿î °ªÀ» ¸¸µé ¾î ÁÖ°í ¿ø·¡ °ªÀ¸·Î º¹¿øÀ» ÇÒ¶§´Â ±× ¹Ý´ë ¹æ¹ýÀ» ¾²´Â°Ì´Ï´Ù ±×¿Ü¿¡ ÆÐŶ¿¡ ƯÁ¤ ¸¶½ºÅ©¸¦ ÀÌ¿ëÇÑ ºñÆ® ¿¬»ê(And, Or, Xor)À» ÇØ ÁÖ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ±×¸®°í ƯÁ¤ÇÑ Áֱ⸶´Ù ¾Ïȣȭ ÆÐÅÏÀ» ¹Ù²Ù¾î ÁÖ´Â ¹æ¹ýµµ »ý°¢ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. [¾ÐÃàÈ­] ¾ÐÃàÈ­´Â ÆÐŶÀÇ ³»¿ëÀ» º¸È£ÇÑ´Ù´Â Ãø¸é°ú ½ÇÁ¦ ÆÐŶÀ» ÁÙÀδٴ µÎ°¡Áö Ãø¸é¿¡ ¼­ ¾ÆÁÖ À¯¿ëÇÑ ÆÐŶ 󸮹æ¹ýÀÔ´Ï´Ù. ¹«¼Õ½Ç ¾ÐÃà¹ýÀÎ RLE, LZW¹æ½ÄÀ» ¾Ö¿ëÇÔÀÌ ÁÁÀ»µíÇÕ´Ï´Ù¸¸, ÀÌ·¸°Ô µÇ¸é, ¾ÐÃà ÆÐŶÀ» ÁÙÀÌ´Â ¸ñÀûÀ» ´Þ¼ºÇÒ ¼ö´Â ÀÖÁö¸¸, ÆРŶ ³ëÃâÀ̶ó´Â ¹®Á¦´Â ÇÇÇÒ¼ö ¾ø°Ô µÉ °ÍÀÔ´Ï´Ù. ±âÁ¸¿¡ ³ª¿Â ¾ÐÃà¹ýÀ» ÀûÀýÈ÷ È° ¿ëÇØ ÀڽŸ¸ÀÌ »ç¿ëÇÏ´Â ¾ÐÃà ±â¼úÀ» °³¹ßÇÏ´Â °Íµµ ÇϳªÀÇ °úÁ¦°¡ µÉ °ÍÀÔ´Ï´Ù. ¾Õ¿¡¼­ ¾Ïȣȭ¿Í ¾ÐÃàÈ­¸¦ À̾߱âÇÑ°ÍÀº º¸¾È¹®Á¦ ¶§¹®ÀÔ´Ï´Ù. ¸î³âÀü ºÎÅÍ ÇØÅ· ±â¼úÀÌ ÇÁ·Î±×·¥È­µÇ¾î ³ª¿Ô±â ¶§¹®¿¡ ³×Æ®¿÷À» Àß ¸ð¸£´Â »ç¶÷µµ ÇØÅ· ÇÁ·Î±×·¥¸¸ ´Ù·êÁÙ ¾È´Ù¸é ÇØÅ·ÀÌ °¡´ÉÇÑ ½Ã´ë·Î Á¢¾îµé¾ú½À´Ï´Ù. NetSpy, NetXRay°°Àº ÇÁ·Î±× ·¥À» Àá±ñ ºÃ´Âµ¥, ƯÁ¤ ¼Û¼ö½Å IP¸¸ Áý¾îÁÖ¸é ±× »çÀÌ¿¡¼­ ¼Û¼ö½ÅµÇ´Â ¸ðµç µ¥ÀÌ ÅÍ°¡ ±×´ë·Î ³ëÃâÀÌ µÇ´õ±º¿ä. °Ô´Ù°¡ ¿øÇÏ´Â Äڵ带 °É·¯¼­ º¸¿©ÁÖ´Â ±â´Éµµ Àֱ⠶§¹®¿¡ ¾Æ¹«¸® ÆÐŶ¾çÀÌ ¸¹¾Æµµ ¿øÇÏ´Â µ¥ÀÌÅ͸¦ ¾ó¸¶µçÁö ½±°Ô °É·¯¼­ º¼ ¼ö ÀÖ°Ô ¸¸µé¾îÁ³½À´Ï´Ù. ÀÌ·± »óȲ¿¡¼­ ¿©·¯ºÐµéÀÇ ¼Û¼ö½Å µ¥ÀÌÅÍ¿¡ ´ëÇÑ º¸¾È ¹®Á¦´Â ´ç ¿¬ÇÑ ÀÏÀÌ µÉ °ÍÀÔ´Ï´Ù. ÀÌ ¹®Á¦´Â ¿©·¯ºÐµé²²¼­ Ç®¾î¾ß ÇÒ ¹®Á¦ÀÔ´Ï´Ù. WinSockÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö #09 ÁöÀºÀÌ:Á¤ÇöÈ£ ÀÌÁ¦ Á¦ ±Ûµµ ¸·¹ÙÁö¿¡ À̸¥µíÇÕ´Ï´Ù. Ưº°È÷ »õ·Î¿ï°ÍÀº ¾ø½À´Ï´Ù. ´ÜÁö, Áö±Ý±îÁö ÇØ¿Ô´ø ¿©·¯°¡ÁöµéÀ» ¾î¶»°Ô ¹­´ÂÁö¸¸À» º¸¿©ÁÖ´Â Á¤µµÀÔ´Ï´Ù. Áö±Ý±îÁö ÀÇ ³»¿ëÀ» Àß ÀÌÇØÇϽŠºÐÀ̶ó¸é °¡º±°Ô ÀÌÇØÇϽǼö ÀÖÀ¸¸®¶ó º¾´Ï´Ù. ±×·³ ½ÃÀÛÇÏÁÒ. [¿¹Á¦ÄÚµå ÇÁ·ÎÁ§Æ® ±¸¼º¹× »ç¿ë¹ý] À̱۰ú °ü°èµÈ ÇÁ·ÎÁ§Æ®´Â chat\server, chat\clientÀÔ´Ï´Ù. ¼³¸íÀº ¼­¹ö¿¡ °ü·Ã µÈ ºÎºÐ¸¸ ÇÏ°ÚÁö¸¸, ±âº»ÀûÀ¸·Î Ŭ¶óÀ̾ðÆ®/¼­¹öÀÇ ±¸Á¶°¡ 90%ÀÌ»ó °°°í ´Ù¸¥ ºÎºÐ 10%´Â ÀÌ¹Ì ¾Õ¿¡¼­ ¾ð±ÞÀ» Ç߱⠶§¹®¿¡ ´õ ÀÌ»ó ¾÷±ÞÇÏÁö ¾ÊÀ»°ÍÀÔ´Ï´Ù. ^^; µÎ ÇÁ·ÎÁ§Æ®¿¡ Æ÷ÇÔµÈ ws2_32.lib wsock32.lib ÆÄÀÏÀ» ÀçÁ¤ÀÇ ÇϼžßÇÕ´Ï´Ù. ¸¸ÀÏ ÀÚ½ÅÀÇ IP°¡ 111.222.111.222À̸é? server 111.222.111.222 5001 <-(Æ÷Æ®¹øÈ£ 5001Àº ÀÓÀÇ·Î Àâ¾Ò½À´Ï´Ù.) client 111.222.111.222 5001 <-(¼­¹ö¿¡ Á¢¼ÓÇϱâ À§ÇØ Æ÷Æ® ¹øÈ£¸¦ 5001·Î....) ¿ì¼± ¼­¹öÂÊ¿¡¼­ ÇÁ·Î±×·¥À» ½ÇÇà ½ÃÄѳõ°í Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ±â´Ù¸³´Ï´Ù. Ŭ ¶óÀ̾ðÆ®¿Í ¿¬°áÀÌ ¼º¸³µÇ¸é, äÆÃÀÌ °¡´ÉÇØÁý´Ï´Ù. Á¾·á ¸í·É¾î´Â /q,/QÀÌ¸ç ¾î´À ÇÑÂÊÀÇ ¿¬°áÀÌ ²÷¾îÁö¸é ¾çÂÊÀÇ ¿¬°áÀÌ ²÷¾îÁý´Ï´Ù. Ưº°È÷ º° ±â´ÉÀº ¾ø°í ¾îÂ¸é ¾ÆÁÖ ÃʶóÇÑ ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ÇÏÁö¸¸ ±âº»¿¡¼­¸¸ Àº º¼ ºÎºÐÀÌ ±×·°Àú·° ÀÖ´Ù°í »ý°¢ÇÕ´Ï´Ù. ´Ü¼øÈ÷ 1:1ÀÇ Ã¤ÆÃÀÌÁö¸¸ Á¶±Ý¸¸ ¼ÕÀ» º¸¸é n:nÀÇ Ã¤Æõµ °¡´ÉÇÕ´Ï´Ù. ¶ÇÇÑ Á¶±Ý¸¸ »ý°¢À» ÇÏ½Ã¸é ·Îºñ¼­¹ö³ª Á» ´õ ¼¼·Ã µÈ ¼­¹ö¸¦ »ý°¢ÇØ ³»½Ç¼ö ÀÖÀ»°Ì´Ï´Ù. Ç×»ó À̾߱âÇÏÁö¸¸ Á¦°¡ ¿©·¯ºÐ²² Á¦°øÇØ µå¸° °ÍÀº °¡À̵å¶óÀÎÀÌÁö ¾î¶² Á¤ÇüÈ­µÈ ÇüÅ°¡ ¾Æ´Õ´Ï´Ù. ±× °¡À̵å¶óÀο¡ ¹®Á¦ °¡ ¸¹±â´Â ÇÕ´Ï´Ù¸¸...... ^^; [À©µµ¿ì ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö] *[SendQueue] *[¼ÒÄÏ À̺¥Æ® °ü¸® ¾²·¹µå »ý¼º] *[äÆà ¸Þ½ÃÁö¸¦ À§ÇÑ ÆÐŶ¸¸µé±â] *[send/recv½Ã Å¥¸¦ ÀÌ¿ëÇÔ] [¼­¹ö ÇÁ·Î±×·¥ÀÇ ±¸Á¶] ¿ì¼±Àº ÀüüÀûÀÎ ±¸Á¶¸¦ º¸µµ·Ï ÇÏÁÒ. 1. ¼ÒÄÏÃʱâÈ­ ¹× Á¢¼Ó ¿äûÀ» ±â´Ù¸². 2. ¼­¹ö ³×Æ®¿÷ À̺¥Æ® °ü¸® ½º·¹µå È°¼ºÈ­. 3. äÆà ¸Þ½ÃÁö ±³È¯. 4. ÇÁ·Î±×·¥ Á¾·á. À§ÀÇ ³»¿ëÀÌ ÀüºÎÀÔ´Ï´Ù. ^^; Çϳª Çϳª ¶â¾î º¸µµ·ÏÇÏÁÒ. chat\server\server.cppÆÄÀÏÀ» ¿­¾î º¸µµ·ÏÇÏÁÒ. ±×¸®°í mainÇÔ¼ö¸¦ º¸°Ú½À´Ï´Ù. ±âÁ¸ÀÇ ÄÚµå¿Í Å©°Ô ´Ù¸¥ºÎºÐÀÌ ¸î¸î ´«¿¡ º¸À̴±º¿ä. Á¤¸®Çϸé...... 1. SendQueue 2. ¼ÒÄÏ À̺¥Æ® °ü¸® ¾²·¹µå »ý¼º. 3. äÆà ¸Þ½ÃÁö¸¦ À§ÇÑ ÆÐŶ¸¸µé±â. 4. send/recv Å¥ ´ë°­ À§¿¡ ¾ð±ÞÇÑ Á¤µµÀÔ´Ï´Ù. [SendQueue] Á¦°¡ ¸¸µç Send Queue ±¸Á¶Ã¼ÀÔ´Ï´Ù. ±× ±¸Á¶´Â ¾Æ·¡¿Í °°½À´Ï´Ù. #define SendQueueSize 999 struct tag_SendQueue { int CurrentPos; int DesPos; int PacketSize[SendQueueSize]; char *Packet[SendQueueSize]; } SendQueue; CurrentPos : ÇöÀç Å¥ÀÇ À§Ä¡. DesPos : ÇöÀç ½×ÀΠťÀÇ À§Ä¡. PacketSize : º¸³»Áö ¸øÇÏ°í Å¥¿¡ ½×ÀÎ ÆÐŶÀÇ Å©±â. Packet : º¸³»Áö ¸øÇÑ ÆÐŶÀÇ ³»¿ë. ÀÌ¹Ì ¿©¼¸¹ø° ±Û¿¡¼­ ¾ð±ÞÇß´ø ³»¿ëÀÌÁÒ. send/recv½Ã¿£ Å¥¸¦ ¸¸µé¾î¼­ µ¥ÀÌÅÍÀÇ ¼Û¼ö½Å½Ã ¹ß»ýÇÒ¼ö ÀÖ´Â ¹®Á¦¸¦ ÇØ°áÇÑ´Ù´Â ºÎºÐÀ» ±¸Ã¼È­Çϱâ À§Çؼ­ ¸¸µç Å¥ÀÔ´Ï´Ù. ±¸Á¶Ã¼ÀÇ À̸§ ±×´ë·Î send½Ã¿¡ ÆÐŶÀ» º¸³»Áö ¸øÇÒ °æ¿ì¸¦ ´ëºñÇؼ­ ¸¸µé¾ú½À´Ï´Ù. Á¶±Ý ´õ ÀÐ¾î ³ª°¡½Ã¸é ±× ¾²ÀÓÀ» ¾Ë°Ô µË´Ï´Ù. [¼ÒÄÏ À̺¥Æ® °ü¸® ¾²·¹µå »ý¼º] ¿©±â¿¡µµ ÇÑ °¡Áö°¡ Ãß°¡µÇ¾ú½À´Ï´Ù. ServerProcessThread¸¦ º¸°Ô µÇ¸é FD_WRITE¶ó´Â ³×Æ®¿÷ À̺¥Æ®°¡ »õ·Î Ãß°¡µÇ¾ú½À´Ï´Ù. FD_WRITE´Â send°¡ °¡´ÉÇÏ´Ù´Â ½ÅÈ£¸¦ ¹Þ¾Æ ³»´Â°Ì´Ï´Ù. FD_WRITE´Â connectÈÄ(Áï »ó´ë ³× Æ®¿÷¿¡ ¿¬°áÈÄ)¿Í send°¡ °¡´ÉÇØÁø ½ÃÁ¡¿¡¼­ ¹ß»ýÇÕ´Ï´Ù. Áï, send°¡ °¡´ÉÇÑÁö¸¦ ÆÇ´ÜÇϱâ À§Çؼ­ ÇÊ¿äÇÕ´Ï´Ù. ½ÇÁ¦ Äڵ带 º¸µµ·ÏÇÏÁÒ. //Sendable´Â send°¡ °¡´ÉÇÑÁö ÆǺ°Çϱâ À§ÇÑ Àü¿ª º¯¼öÀÔ´Ï´Ù. if ((event.lNetworkEvents & FD_WRITE) == FD_WRITE) { Sendable = true; } [äÆà ¸Þ½ÃÁö¸¦ À§ÇÑ ÆÐŶ¸¸µé±â] ¿ì¼± Á¦°¡ ¾²´Â Ŭ¶óÀ̾ðÆ®/¼­¹öÀÇ ÆÐŶ ±¸Á¶¸¦ º¸°Ú½À´Ï´Ù. 2¹ÙÀÌÆ® : ÆÐŶÀÇ Àüüũ±â. 1¹ÙÀÌÆ® : ÆÐŶÀÇ ¼º°Ý. ³ª¸ÓÁö : ÆÐŶÀÇ ³»¿ë. ¸¸¾à ÆÐŶÀÇ ¼º°ÝÀÌ ¾Æ·¡¿Í °°ÀÌ Á¤ÀǵǾî Àִµ¥, äÆÃÀ̸ç, ±× ³»¿ëÀÌ "¾È³çÇϼ¼¿ä?"À϶§ ÆÐŶÀº ¾î¶»°Ô ±¸¼ºÀÌ µÉ±î¿ä? #define Packet_Chat 0x00 //äÆÃ. #define Packet_RequestUserInfo 0x01 //À¯ÀúÀÇ Á¤º¸¸¦ ¿ä±¸ÇÑ´Ù. #define Packet_Attack 0x02 //°ø°Ý½ÅÈ£ #define Packet_UseItem 0x03 //¾ÆÀÌÅÛÀ» ¾´´Ù. ¹ÙÀÌÆ® ³»¿ë 2 15(10Áø¼ö) 1 Packet_Chat == 0 12 ¾È³çÇϼ¼¿ä?\0 À§¿Í °°½À´Ï´Ù. ÆÐŶÀÇ ±¸Á¶¿¡ °üÇؼ­ À̾߱⸦ Çϱä ÇßÁö¸¸ ±¸Ã¼È­ Çϱä À̹øÀÌ Ã³À½ÀÎ°Í °°½À´Ï´Ù. ^^; ±×·³ ½ÇÁ¦ ÆÐŶÀ» ¸¸µé°í º¸³»´Â Äڵ带 º¸ÁÒ. *MsgBuffer¾È¿¡ äÆà ³»¿ëÀÌ µé¾î ÀÖ´Ù°í °¡Á¤À» ÇÏÁÒ. int MsgSize; char *Packet = NULL; MsgSize = strlen( MsgBuffer ); //äÆà ³»¿ëÀÇ ±æÀ̸¦ ¾Ë¾Æ³À´Ï´Ù. MsgSize+=3; //ÆÐŶÀÇ ±æÀÌ, ÆÐŶÀÇ ¼º°Ý°ª±îÁö ´õÇؼ­ ½ÇÁ¦ ÆÐŶ //ÀÇ ±æÀ̸¦ ±¸ÇÕ´Ï´Ù. Packet = (char *)malloc( MsgSize ); //ÆÐŶÀÇ Å©±â¸¸Å­ ¸Þ¸ð¸®È®º¸. memcpy( &Packet[0], &MsgSize, 2 ); //ÆÐŶÀÇ ±æÀ̸¦ óÀ½ 2¹ÙÀÌÆ®¿¡... memset( &Packet[2], Packet_Chat, 1 ); //ÆÐŶÀÇ ¼º°ÝÀ» ´ÙÀ½ 1¹ÙÀÌÆ®... memcpy( &Packet[3], MsgBuffer, MsgSize-3 ); //½ÇÁ¦ ³»¿ëÀ» ¸¶Áö¸·¿¡... SendPacket( Packet, MsgSize ) //ÆÐŶÀ» º¸³À´Ï´Ù. sendpacketÇÔ¼ö´Â //¹Ù·Î ´ÙÀ½Àý¿¡ ¼³¸íÇÏ°Ú½À´Ï´Ù. free( Packet ); //ÆÐŶÀ» ´Ù º¸³ÂÀ¸¸é ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÕ´Ï´Ù. [send Å¥] ¿À´ÃÀÇ ÇÙ½ÉÀÎ send/recvÅ¥¿¡ °üÇÑ ¼³¸íÀ̱º¿ä. ¿ì¼± SendPacketÇÔ¼ö¸¦ º¸µµ·ÏÇÏÁÒ. ÀÌ¹Ì ¿©¼¸¹ø° ±Û¿¡¼­ ¾ð±ÞÀ» ÇßµíÀÌ send¸¦ ÇÑ´Ù°í ¹«Á¶°Ç Àü¼ÛµÇ´Â°Ç ¾Æ´Õ´Ï´Ù. ´ç¿¬È÷ ±×·² °æ¿ì¿£ µ¥ÀÌÅ͸¦ ¼Û½ÅÀÚ ÄÄÇ»ÅÍ¿¡ ÀúÀåÇß´Ù°¡ send°¡ °¡´ÉÇÑ »óȲÀÌ µÇ¸é ÀúÀåµÈ°÷ÀÇ µ¥ÀÌÅ͸¦ Âü°íÇؼ­ º¸³»ÁÖ¾î¾ßÇÕ´Ï´Ù. ÀÌ¹Ì ±× »óȲ°ú »ç¿ë¹ýÀº ¿©¼¸¹ø° ±Û¿¡¼­ ¾ð±ÞÇßÀ¸ ¹Ç·Î ´õ ÀÌ»ó¾ð±ÞÇÏÁö ¾Ê°Ú½À´Ï´Ù. ´Ù¸¸, ¾î¶»°Ô ÄÚµùÀ» ÇؾßÇÏ´ÂÁö¸¦ º¸°Ú½À´Ï´Ù. send°¡´ÉÇÑ »óȲÀÎÁö ÆÇ´ÜÀ» ÇÕ´Ï´Ù. if( Sendable == true ) //send°¡´ÉÇϸé... { ÇöÀç Å¥¸¦ È®ÀÎÇؼ­ ¸øº¸³½ ÆÐŶÀÌ ÀÖÀ¸¸é º¸³½´Ù. º¸³»´ÂÁß¿¡ send ºÒ°¡´É »óȲÀÌ ¹ß»ýÇÏ¸é ±×°÷¿¡¼­ ¸ØÃß°í º¸³¾ ÆÐŶÀº Å¥¿¡ ³Ö´Â´Ù. bool Processed = false; Processed = ProcessQueue(); send°¡´ÉÇÑ »óȲÀ̸é? sendÇÔ¼ö·Î µ¥ÀÌÅ͸¦ º¸³»º¾´Ï´Ù. ¸¸¾à ¹®Á¦°¡ ¹ß»ýÇϸé Å¥¿¡ ÆÐŶÀ» ³Ö°í ¾Æ´Ï¸é µ¥ÀÌÅ͸¦ ¼Û½ÅÀ» ¿Ï·áÇÕ´Ï´Ù. sendºÒ°¡´ÉÇÑ »óȲÀ̸é? ÆÐŶÀ» Å¥¿¡ ³Ö½À´Ï´Ù. } else //send°¡ ºÒ°¡´ÉÇÑ »óȲÀ̸é? { ÆÐŶÀ» Å¥¿¡ ³Ö½À´Ï´Ù. } ´Ù¸¥ºÐµéÀº ¾î¶»°Ô ÇÏ´ÂÁö ¸ð¸£°Ú½À´Ï´Ù¸¸, Àú´Â À§¿Í°°Àº ¹æ¹ýÀ» »ý°¢Çß½À´Ï´Ù. ½ÇÁ¦ ÄÚµå·Î´Â ¾î¶»°Ô Àû¿ëµÇ´Â º¸°Ú½À´Ï´Ù. ÄÚµå Áß°£¿¡ ³ª¿À´Â ProcessQueue ¿Í InsertQueueÇÔ¼ö´Â ´ÙÀ½ Àý¿¡¼­ º¸°Ú½À´Ï´Ù. if( Sendable == true ) { //Å¥¸¦ È®ÀÎÇغ»´Ù. ÀÖÀ¸¸é º¸³½´Ù. ´Ù º¸³¾¼ö ÀÖÀ»¶§ ±îÁö º¸³»º»´Ù. //¸¸¾à ¸ø º¸³»¸é PacketÀº ¶Ç Å¥¿¡ ³Ö´Â´Ù. bool Processed = false; Processed = ProcessQueue(); //Å¥¿¡ ´õÀÌ»ó º¸³¾ ÆÐŶÀÌ ³²¾ÆÀÖÁö //¾ÊÀ¸¸é true¸®ÅÏ if( Processed == true ) //Å¥¿¡ ¾Æ¹«°Íµµ ³²¾Æ ÀÖÁö ¾ÊÀ¸¸é? { TotalSendSize = 0; if( Sendable == true ) //Àü¼ÛÀÌ °¡´ÉÇÑ »óȲÀ̸é? { while( 1 ) { SendSize = send( MyClient.ClientSocket, Packet, MsgSize, 0 ); if( SendSize == SOCKET_ERROR ) //send½Ã ¹®Á¦¹ß»ý { int Error = WSAGetLastError(); if( Error == WSAEWOULDBLOCK ) //¼ÒÄÏÇÔ¼ö°¡ Áï½Ã ½ÇÇàµÉ¼ö ¾ø´Â //»óȲ. Áï, sendÇÔ¼ö°¡ ¼öÇàµÉ¼ö //¾ø´Â »óȲÀÔ´Ï´Ù. { printf( "Å¥¿¡ µ¥ÀÌÅ͸¦ ³Ö½À´Ï´Ù.\n" ); Sendable = false; InsertQueue( Packet, MsgSize, TotalSendSize ); break; } else //¼ÒÄÏÇÔ¼ö°¡ Áï½Ã ½ÇÇàµÉ¼ö ¾ø´Â »óȲÀÌ ¾Æ´Ï¸é °ÅÀÇ Á¢¼ÓÀÌ //²÷±ä °æ¿ìÀ̹ǷΠÇÁ·Î±×·¥À» Á¾·áÇÕ´Ï´Ù. { BreakFlag = true; break; } } else { TotalSendSize += SendSize; if( TotalSendSize >= MsgSize ) { SendSucceeded = true; break; } } } } else //if Sendable == false { InsertQueue( Packet, MsgSize, TotalSendSize ); printf( "Å¥¿¡ ³Ö°Ú½À´Ï´Ù.\n" ); } } else //if Processed == false Å¥¿¡ ³²Àº ÆÐŶÀ» º¸³»´ÂÁß sendºÒ°¡´É //»óȲÀÌ ¹ß»ý. { InsertQueue( Packet, MsgSize, TotalSendSize ); printf( "ÆÐŶÀ» º¸³»Áö ¸øÇß½À´Ï´Ù. Å¥¿¡ ³Ö°Ú½À´Ï´Ù.\n" ); } } else //if Sendable == false { InsertQueue( Packet, MsgSize, TotalSendSize ); printf( "ÆÐŶÀ» º¸³»Áö ¸øÇß½À´Ï´Ù. Å¥¿¡ ³Ö°Ú½À´Ï´Ù.\n" ); } [ProcessQueue / InsertQueue ] *InsertQueue Å¥»ðÀÎ ÇÔ¼ö´Â send½ÇÆнÿ¡ ÇÁ·Î±×·¥¿¡¼­ ¸¸µé¾îµÐ ±¸Á¶Ã¼¿¡ ÆÐŶÀ» ³Ö´Â ÇÔ¼ö ÀÔ´Ï´Ù. ÆÐŶÀÇ ³»¿ë, Å©±â, º¸³½ ÆÐŶÀÇ Å©±â¸¦ ÀÎÀÚ·Î ¹Þ½À´Ï´Ù. int InsertQueue( char *Packet, int MsgSize, int TotalSendSize ) { //Å¥¿¡ ÆÐŶÀ» ÀúÀåÇϱâ À§ÇØ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÕ´Ï´Ù. if( SendQueue.Packet[SendQueue.DesPos] != NULL) { free( SendQueue.Packet[SendQueue.DesPos] ); SendQueue.Packet[SendQueue.DesPos] = NULL; } SendQueue.Packet[SendQueue.DesPos] = (char *)malloc ( MsgSize - TotalSendSize ); //ÇÒ´çµÈ °ø°£¿¡ º¸³»Áö ¸øÇÑ ÆÐŶÀ» ÀúÀåÇÕ´Ï´Ù. memcpy( SendQueue.Packet[SendQueue.DesPos], &Packet[TotalSendSize], MsgSize - TotalSendSize ); //ÆÐŶÀÇ Å©±â¸¦ ÀúÀåÇصӴϴÙ. SendQueue.PacketSize[SendQueue.DesPos] = MsgSize - TotalSendSize; //Å¥¿¡ ÀúÀåµÈ ÆÐŶÀÇ À§Ä¡¸¦ Áõ°¡½Ãŵ´Ï´Ù. SendQueue.DesPos++; //999°¡ µÇ¸é 0À¸·Î ¹Ýº¹µÇ´Â ÀÏÁ¾ÀÇ ¼øȯťÀÔ´Ï´Ù. if( SendQueue.DesPos >= 999 ) SendQueue.DesPos = 0; return 1; } *ProcessQueue SendQueue±¸Á¶Ã¼¸¦ ÂüÁ¶Çؼ­ º¸³»Áö ¸øÇÑ ÆÐŶÀÌ ÀÖÀ¸¸é º¸³À´Ï´Ù. [recv Å¥] ÀÌ¹Ì ¿©¼¸¹ø° ±Û¿¡¼­ ¾ð±ÞÇßµíÀÌ recv ¶ÇÇÑ sendó·³ ³×Æ®¿÷»ó¿¡¼­ ÀÏÁ¤ÇÑ Å©±â·Î Àß·Á¿Ã¼ö Àֱ⠶§¹®¿¡ Å¥¸¦ ¸¸µé¾î µÎ¾î¾ßÇÕ´Ï´Ù. //¹ÞÀ» µ¥ÀÌÅÍ°¡ ÀÖÀ¸¸é? if ((event.lNetworkEvents & FD_READ) == FD_READ) { //µ¥ÀÌÅ͸¦ ¹Þ¾Æº»´Ù. retval = recv( MyServer.ServerSocket, Buffer, sizeof Buffer, 0 ); if( retval > 0 ) //¸¸¾à ¸î ¹ÙÀÌÆ®¶óµµ ¹Þ¾ÒÀ¸¸é? { //Å¥¿¡ µ¥ÀÌÅ͸¦ ³Ö¾îµÐ´Ù. unsigned short Size; memcpy( &Queue[QueuePosition], Buffer, retval ); QueuePosition += retval; while( 1 ) { //ÆÐŶÀÇ ±¸Á¶¿¡ µû¶ó óÀ½ 2¹ÙÀÌÆ®(ÆÐŶÀÇ Å©±â¸¸Å­)¸¦ ¹ÞÀ¸¸é, //ÀÎÁ¤À» ÇϱâÀ§ÇØ Àüü Å©±â¸¦ ¾Ë¾ÆµÐ´Ù. memcpy( &Size, &Queue[0], 2 ); //Àüü Å©±â¸¸Å­ ¹Þ¾ÒÀ¸¸é? if( QueuePosition >= Size ) { char *Message=NULL; char ReturnMessage; Message = (char *)malloc( Size ); memcpy( Message, &Queue[0], Size ); //¿ÏÀüÈ÷ ÆÐŶÀ» ¹Þ¾ÒÀ¸¸é, ±× ÆÐŶÀ» ÀûÀýÈ÷ 󸮸¦ÇÑ´Ù. ReturnMessage = ProcessClientMessage( Message ); QueuePosition-=Size; memcpy( &Queue[0], &Queue[Size], QueuePosition ); free( Message ); } else { break; } } } } ÇÑ°¡Áö ¼³¸íÀÌ ºüÁøµíÇϱº¿ä. ReturnMessage = ProcessClientMessage( Message ); ¹Ù·Î À§ ºÎºÐÀÔ´Ï´Ù. ¿ÏÀüÈ÷ ÆÐŶÀ» ¹Þ¾ÒÀ»¶§ ±× ÆÐŶÀ» ó¸®ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î µÎ´Â°Ì´Ï´Ù. ±× ³»¿ëÀ» º¸ÁÒ....... //ÆÐŶ¿¡ °üÇÑ Á¤Àǵé...... #define Packet_Chat 0x00 //äÆÃ. #define Packet_RequestUserInfo 0x01 //À¯ÀúÀÇ Á¤º¸¸¦ ¿ä±¸ÇÑ´Ù. #define Packet_Attack 0x02 //°ø°Ý½ÅÈ£ #define Packet_UseItem 0x03 //¾ÆÀÌÅÛÀ» ¾´´Ù. int ProcessClientMessage( char *Message ) { if( Message[2] == Packet_Chat ) //äÆà ¸Þ½ÃÁö. { char *MsgPtr = &Message[3]; printf( "¼­¹ö : %s\n", MsgPtr ); } return 1; } ÇöÀç´Â äÆà ¸Þ½ÃÁö¿¡ °üÇÑ Ã³¸®¸¸ÀÌ ÀÖ½À´Ï´Ù¸¸, ½ÇÁ¦ äÆà ÇÁ·Î±×·¥À» ¸¸µé´Ù º¸¸é ´õ ¸¹Àº ÆÐŶÀÇ ¼º°ÝÀÌ ÇÊ¿äÇÒ°ÍÀÔ´Ï´Ù. ±× ºÎºÐ¿¡ °üÇÑ Á¤ÀÇ´Â ¿©·¯ºÐµéÀÌ Ãß°¡¸¦ ÇÏ½Ã¸é µË´Ï´Ù. ±×¸®°í ProcessClientMessage¾È¿¡ Ãß°¡ÇØ ÁÖ½Ã¸é µÇ°ÚÁÒ? ÀÌ¹Ì ¾Õ¿¡¼­µµ ¾ð±ÞÇßÁö¸¸ Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥µµ µû·Î ºÐ¼®À» ÇÏ·ÁÇß½À´Ï´Ù¸¸ Áö±Ý±îÁö °Ô½ÃµÈ ¸ðµç ±ÛÀ» ÀÌÇØÇϼ̴ٸé, Ưº°ÇÑ ¼³¸íÀÌ ¾ø¾îµµ µÉ °Í °°½À´Ï´Ù. ¾îÂî¾îÂîÇÏ¿© ±ÛÀº ´Ù ¿Ï¼ºÀ» Çß½À´Ï´Ù¸¸, ¾Æ½¬¿òÀÌ Å©³×¿ä. ½Ã°£¿¡ Âѱâ°í ¸öµµ ÇÇ°ïÇÏ°í ¹°·Ð Á¤½Å·ÂÀ¸·Î ÇØ°áÇÏ¸é µÇ´Â ºÎºÐÀ̱ä ÇÏÁö¸¸ Àß µÇÁú ¾Ê¾Ò³×¿ä. ±×·¡ ¼­ ´õ ¾Æ½¬¿îÁöµµ ¸ð¸£°Ú½À´Ï´Ù. ¼ÖÁ÷È÷ ³×Æ®¿÷Àº Àß ÇÏ´Â ºÎºÐµµ ¾Æ´Ï°í °ü½É¹Û ºÐ¾ßÀ̱⠶§¹®¿¡ ÀÌ ±ÛÀ» ¿Ã·Á¾ßÇÒÁö¿¡ ´ëÇؼ­ ¸¹ÀÌ »ý°¢À» Çß½À´Ï´Ù. ³×Æ®¿÷ ÇÁ·Î ±×·¥ÀÇ Áß¿äÇÑ °³³äÀ» ¸¹ÀÌ ¾ð±ÞÇÏÁö ¸øÇѰ͵µ »ç½ÇÀÌ°í¿ä. ¹°·Ð ÀÌ·± ¸»·Î ¸éÁ˺Π¸¦ ¹Þ°Ú´Ù´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ´ÜÁö, ¾Æ½¬¿òÀ» Ç¥ÇÒ»ÓÀÌÁÒ. ^^; Á¦ ±ÛÀÌ ³×Æ®¿÷ ÇÁ ·Î±×·¥À» ½ÃÀÛÇÏ´Â ºÐµé²² ÀÛ°Ô³ª¸¶ µµ¿òÀÌ µÇ¾úÀ¸¸é ÁÁ°Ú½À´Ï´Ù. -------------------------------------------------------------------------------- TCP/IP¸¦ ±â¹ÝÀ¸·ÎÇÑ ¿Â¶óÀÎ °ÔÀÓ Á¦ÀÛ -------------------------------------------------------------------------------- ÃÖ±Ùµé¾î ¿Â¶óÀÎ °ÔÀÓµéÀÌ Á¡Á¡ ´ëÁßÈ­µÇ¸ç Àα⸦ ²ø°í ÀÖ´Ù. ƯÈ÷ ¼öõ ¸íÀÌ ÇϳªÀÇ ¼­¹ö¿¡¼­ °ÔÀÓ ³» °¡»ó½ºÆäÀ̽º¸¦ °øÀ¯Çϸç Ç÷¹ÀÌÇÏ´Â ±×·¡ÇÈ ¸ÓµåÀÇ °³¹ß°ú µ¿ÀÛ¿ø¸®´Â °ÔÀÓ °³¹ßÀ» ½ÃÀÛÇÏ·Á´Â »ç¶÷µé¿¡°Ô ¸¹Àº °ü½ÉÀÇ ´ë»óÀÌ µÇ°í ÀÖ´Ù. 3ºÎ¿¡¼­´Â °£´ÜÇÑ ±×·¡ÇÈ ¸ÓµåÀÇ ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥À» ±¸ÇöÇÏ°í À̸¦ ÅëÇØ ±× ±¸Á¶¸¦ »ìÆ캻´Ù. ¿Â¶óÀÎ °ÔÀÓ°ú ½Ì±ÛÀ¯Àú °ÔÀÓÀº »ç½Ç º°´Ù¸¥ Â÷ÀÌÁ¡ÀÌ ¾ø´Ù. À̸¦ RPG·Î ÇÑÁ¤ÇÏ°í »ý°¢ÇÑ´Ù°í Çصµ À¯ÀÏÇÏ°Ô ´Ù¸¥ Á¡Àº ÇÑ°¡Áö»ÓÀÌ´Ù. ÇöÀç ³»°¡ Ç÷¹ÀÌÇÏ°í ÀÖ´Â °ÔÀÓÀÇ ¿©·¯ ÀÚ¿øµé, Áï °ÔÀÓ ³»ÀÇ ³ªÀÇ ºÐ½ÅÀÎ °ÔÀÓ Ä³¸¯ÅÍ¿Í Ä³¸¯ÅÍ°¡ ½Î¿ì°í ÀÖ´Â °ÔÀÓ ¼ÓÀÇ ¸ó½ºÅÍ, ij¸¯ÅÍ°¡ °¡Áö°í ÀÖ´Â ¾ÆÀÌÅÛ, ¿·À» °É¾î Áö³ª°¡´Â ¸¶À»ÁֹΠµîÀÌ °ÔÀÓÀÌ Ç÷¹ÀÌ ÁßÀÎ ÀÚ±â PC¿¡ ÀÖ´Â³Ä ¾Æ´Ï¸é ·£À̳ª ÀüÈ­¼±À¸·Î ¿¬°áµÈ ¿Â¶óÀÎ »óÀÇ ¾î´À °÷¿¡ Á¸ÀçÇÏ´À³Ä ÀÏ»ÓÀÌ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ¸ÖƼÀ¯Àú °ÔÀÓ°ú ½Ì±ÛÀ¯Àú °ÔÀÓÀÇ Â÷ÀÌÁ¡Àº °ÔÀÓÁ¦ÀÛ¿¡¼­ ½ÇÁ¦ °³¹ß»Ó¸¸ÀÌ ¾Æ´Ï¶ó ±âȹ´Ü°èºÎÅÍ ¸¹Àº Á¦¾àÀ» ¹Þ°Ô µÈ´Ù. ½Ì±ÛÀ¯Àú¶ó¸é °£´ÜÇÏ°Ô ¸¸µé ¼ö ÀÖ´Â RPGÀÇ Äù½ºÆ®µµ ¸ÖƼÀ¯Àú ¿Â¶óÀÎ RPG¶ó¸é ¾öû³­ ÀÏÀÌ µÈ´Ù. ¿¹¸¦ µé¾î µÞ»ê¿¡ ÀÖ´Â ¾î¶² º¸½º±Þ ¸ó½ºÅ͸¦ Á×ÀÌ¸é ²Ï ÁÁÀº ¾ÆÀÌÅÛÀ» ÁÖ´Â À̺¥Æ®¸¦ ¸¸µç´Ù°í ÇÒ ¶§ ½Ì±ÛÀ¯Àú °ÔÀÓÀ̶ó¸é º° ¹®Á¦°¡ ¾Æ´Ò ¼öµµ ÀÖÁö¸¸ ¸ÖƼÀ¯Àú °ÔÀÓÀ̶ó¸é ¹®Á¦°¡ Ʋ¸®´Ù. °°Àº °ÔÀÓÀ» Ç÷¹ÀÌÁßÀÎ Ç÷¹À̾ ÇÑ ¸íÀÌ ¾Æ´Ï¶ó ¼ö¹é ¶Ç´Â ¼öõ ¸íÀÌ µÉ ¼öµµ Àֱ⠶§¹®¿¡ ¸ó½ºÅÍ°¡ ÁÖ´Â ¾ÆÀÌÅÛÀÌ ÁÁÀ» °æ¿ì ÇÑ ¸íÀÇ ¿ë°¨ÇÑ ¿ë»ç°¡ ¾Æ´Ï¶ó ¼ö¹é ¸íÀÌ ¸» ±×´ë·Î ÀÎÇØÀü¼ú·Î ¸ó½ºÅÍ ÇѸ¶¸®¸¦ Àâ±â À§ÇØ ¸ô·Áµé ¼öµµ ÀÖ´Ù. ÀÌ·² °æ¿ì ±× ¸ó½ºÅÍ´Â ´ç¿¬È÷ ¸î ºÐ¸¸¿¡ Á¦´ë·Î ½Î¿öº¸Áöµµ ¸øÇÏ°í Á×°Ô µÉ °ÍÀÌ°í, Ç÷¹À̾îÀÇ ¼û¸·È÷´Â ¸ðÇèÀ» ±â´ëÇÑ ±âȹÀÚÀÇ ±âȹÀº ½ÇÆÐÇÏ°Ô µÈ´Ù. ¸ÖƼÀ¯Àú°ÔÀÓÀº ÀÌ·± ±âȹ»óÀÇ ¹®Á¦¸¦ ±Øº¹ÇÑ´Ù°í Çصµ ½ÇÁ¦ °³¹ß¿¡¼­ ÇØ°áÇؾßÇÒ ¹®Á¦°¡ ¸¹ÀÌ ³²¾ÆÀÖ´Ù. µ¿±âÈ­ (Synchronization) ¸Ö¸® ¶³¾îÁ® ÀÖ´Â ¸¹Àº °ÔÀÓ Ç÷¹À̾îµéÀÌ ÇϳªÀÇ °¡»ó °ø°£¿¡¼­ °°Àº °ÔÀÓÀ» Áñ±ä´Ù´Â °ÍÀº ºÐ¸íÈ÷ ¸Å·ÂÀûÀ̱â´Â ÇÏÁö¸¸, °³¹ßÀÚ¿¡°Ô´Â ¸¹Àº °ñÄ¡°Å¸®¸¦ Á¦°øÇÑ´Ù. °ÔÀ̸ӵéÀÌ ¸ðµÎ µ¿ÀÏÇÑ È¯°æ¿¡¼­ ºü¸¥ ³×Æ®¿öÅ©¸¦ ÅëÇØ °ÔÀÓ¿¡ Á¢¼ÓÇؼ­ °ÔÀÓÀ» Ç÷¹ÀÌÇÑ´Ù¸é ÁÁ°ÚÁö¸¸ ºÒÇàÈ÷ Çö½ÇÀº ±×·¸Áö ¾Ê´Ù. ¾î¶² »ç¶÷Àº T3 ÀÌ»óÀÇ °í¼Óȸ¼±À» ÅëÇؼ­ °ÔÀÓÀ» ÇÒ ¼ö ÀÖ°í ¶Ç ´Ù¸¥ »ç¶÷Àº 1400bpsÀÇ ´À¸° ¸ðµ©¿¡ ³·Àº Ŭ·°ÀÇ 486PC¿¡¼­ °ÔÀÓÀ» ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± »óÀÌÇÑ Á¶°ÇÀÇ Å¬¶óÀ̾ðÆ®µé¿¡°Ô ¡®°ÅÀÇ¡¯ µ¿ÀÏÇÑ ¼­ºñ½º¸¦ Á¦°øÇϱâ À§Çؼ­´Â ¸¹Àº Å×Å©´ÐÀÌ ÇÊ¿äÇÏ´Ù. ÇØÅ· ±×·¡ÇÈ ¸ÓµåÀÇ Æ¯¼º»ó °ÔÀÓ ³»ÀÇ ½ÇÁ¦ µ¥ÀÌÅÍ´Â ·ÎÄà PC¿¡ Á¸ÀçÇÏ°Ô µÈ´Ù. ·ÎÄà PC¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ºÐ¼®ÇÏ°í Á¶ÀÛÇؼ­ °ÔÀÓÀ» ÆíÇÏ°Ô Áñ±â´Â ´Ü¼øÇÑ ÇØÅ·¿¡¼­ºÎÅÍ TCP/IPÀÇ ÇÏÀ§ ·¹À̾ ħÅõÇؼ­ ÆÐŶÀ» °¡·Îä ºÐ¼®ÇÑ ´ÙÀ½ °¡Â¥ ÆÐŶÀ» ¼­¹ö¿¡ º¸³»´Â Àü¹® ÇØÄ¿±îÁö ¼­¹ö¸¦ °ø°ÝÇÏ´Â ¹æ¹ýÀº ´Ù¾çÇÏ´Ù. °³¹ßÀÚ´Â ÆÐŶÀ» ¾ÏȣȭÇϰųª °ÔÀÓ µ¥ÀÌÅ͸¦ ¾ÐÃàÇؼ­ ÀÌ·¯ÇÑ ÇØÅ·¿¡ ´ëÇ×ÇØ¾ß ÇÑ´Ù. ¼­¹öÀÇ ¾ÈÁ¤¼º ÈǸ¢ÇÑ ±âȹ¿¡ ±×·¡ÇÈÀ» ¸¸µå´Â °Í±îÁö´Â ¼øÁ¶·Ó°Ô ÁøÇàÀÌ µÇ´Ù °á±¹ÀÇ ¼­¹öÀÇ ¾ÈÁ¤¼ºÀÌ È®º¸µÇÁö ¾Ê¾Æ °³¹ßÀÌ ½ÇÆÐÇÏ´Â Àϵµ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ½Ì±ÛÀ¯Àú °ÔÀÓÀ̶ó¸é ÀÌ·± ¹®Á¦¿¡ ´ëÇØ °ÆÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø°ÚÁö¸¸, ¸Þ°¡ Ç÷¹À̾ Á¢¼ÓÇÏ´Â °ÔÀÓÀ̶ó¸é ³×Æ®¿öÅ© ¹®Á¦(ÀÌ°ÍÀº ÀÏ´Ü µ·À¸·Î ÇØ°áÇÒ ¼öµµ ÀÖ´Ù)¿Í ¼ö½Ê °³ÀÇ ½º·¹µå¸¦ »ç¿ëÇÒ ¶§ ¹ß»ýÇÏ´Â µ¥µå¶ô, ½Ã½ºÅÛ Á¤Áö, ¸Þ¸ð¸® ÂüÁ¶¿¡·¯ µî ¿À·¡ »ì¾ÆÀÖ´Â ¼­¹ö¸¦ ¸¸µå´Â °ÍÀÌ °ÔÀÓ ÀÚü¸¦ ¸¸µå´Â °Íº¸´Ù ¿ÀÈ÷·Á ¾î·Á¿ï ¼öµµ ÀÖ´Ù. ¾çÁúÀÇ È¸¼± ³×Æ®¿öÅ© °ÔÀÓÀº ´ëºÎºÐ ¸®¾óŸÀÓÀ¸·Î °ÔÀÓÀÌ ÁøÇàµÇ°í ¼­¹ö/Ŭ¶óÀ̾ðÆ® »çÀÌ¿¡ ÁÖ°í¹Þ´Â µ¥ÀÌÅÍÀÇ ¾çÀº ´Ù¸¥ ¼­ºñ½º¿Í ºñ±³ÇÒ ¼ö ¾øÀ» Á¤µµ·Î ¸¹´Ù. ¿Â¶óÀÎ °ÔÀÓ ¼­¹öÀÇ ³×Æ®¿öÅ© Æ®·¡ÇÈÀº »ç¿ëÀÚ°¡ Áõ°¡ÇÒ ¶§¸¶´Ù »ê¼úÁõ°¡°¡ ¾Æ´Ï¶ó ±âÇϱ޼ö·Î Áõ°¡ÇÑ´Ù. ÁÁÀº °ÔÀÓ ¼­¹öÀÇ °³¹ßµµ Áß¿äÇÏÁö¸¸ ¼­ºñ½º°¡ ½ÃÀ۵Ǹé ȸ¼±¿¡µµ ¸¹Àº ÅõÀÚ¸¦ ÇؾßÇÑ´Ù. ¸®½ºÆ® 1 : ½Ã½ºÅÛÀ» Á¤Áö½ÃÅ°´Â °£´ÜÇÑ ÇÁ·Î±×·¥ #include "process.h" #include "stdio.h" unsigned __stdcall thread(void* arg) { while (1) { } return 0; } int main() { int i; for (i = 0; i < 3000; i++) { _beginthreadex(NULL, 0, thread, 0, 0, NULL); } getch(); return 0; } ¸ÖƼ½º·¹µå ÇÁ·Î±×·¡¹Ö ¼­¹ö ÇÁ·Î±×·¡¹Ö¿¡¼­ °¡Àå Áß¿äÇÑ ¿ä¼Ò ÁßÀÇ Çϳª°¡ ½º·¹µå(thread)´Ù(½º·¹µåÀÇ Á¤ÀÇ¿Í ½º·¹µå °ü·Ã API ÇÔ¼öµé¿¡ ´ëÇؼ­´Â Áö¸é°ü°è»ó ÀÚ¼¼È÷ ´Ù·ç±â Èûµé±â ¶§¹®¿¡ »ý·«ÇÏ°Ú´Ù. ½º·¹µå´Â ÇÁ·Î¼¼½º ³»ÀÇ ÀÛÀº ÇÁ·Î¼¼½ºµéÀ̶ó°í ÀÌÇØÇÏ°í ³Ñ¾î°¡µµ ³»¿ëÀ» ÀÌÇØÇÏ´Â µ¥´Â º°´Ù¸¥ ¹®Á¦´Â ¾øÀ» °ÍÀÌ´Ù). ¸ÖƼŽºÅ·ÀÌ Áö¿øµÇ´Â OS¿¡¼­´Â µ¿½Ã¿¡ ¿©·¯ °³ÀÇ ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. À©µµ¿ì 95³ª NT°°ÀÌ ¿ÏÀüÇÑ ¼±Á¡Çü ¸ÖƼŽºÅ· OS¶ó¸é ¹é±×¶ó¿îµå·Î ÇÁ¸°Æ®³ª ÆÄÀÏ º¹»ç °°Àº ÀÛ¾÷À» ÇÏ°í ÀÖ´õ¶óµµ Æ÷±×¶ó¿îµå·Î ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥¿¡ º°·Î ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê°í ¿©·¯ °³ÀÇ ÀÛ¾÷À» µ¿½Ã¿¡ ¼öÇàÇÒ ¼ö ÀÖ´Ù. ¸ÖƼŽºÅ· »Ó¸¸ ¾Æ´Ï¶ó ¸ÖƼ½º·¹µå°¡ Áö¿øµÇ´Â OS¶ó¸é ¿©·¯ °³ÀÇ ÇÁ·Î±×·¥À» µ¿½Ã ½ÇÇà½ÃÅ°´Â °Í»Ó¸¸ ¾Æ´Ï¶ó ÇÑ ÇÁ·Î±×·¥ ¶Ç´Â ÇÁ·Î¼¼½º ¾È¿¡ ¿©·¯ °³ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º(½º·¹µå)µéÀ» ¸¸µé ¼ö ÀÖ´Ù. ÇÑ ÇÁ·Î±×·¥ ³»¿¡¼­µµ ÇöÀç ÀÛ¾÷À» Áß´ÜÇÏÁö ¾Ê°í ¿©·¯ °³ÀÇ ÀÏÀ» ¼öÇàÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î ÆÄÀÏÀ» ÀÐÀ¸¸é¼­ ÀÐÀº ¾çÀ» ´ÙÀ̾ó·Î±× ¹Ú½º¿¡ Ç¥½ÃÇÑ´Ù´øÁö, ¿öµåÇÁ·Î¼¼½º¿¡¼­ »ç¿ëÀÚÀÇ ÀԷ°ú µ¿½Ã¿¡ ¸ÂÃã¹ýÀ» ¸ÂÃß´Â µî ¿©·¯ °¡Áö ¸é¿¡¼­ Æí¸®ÇÏ°Ô »ç¿ëÀÌ °¡´ÉÇÏ´Ù. ÆíÇØ º¸À̱â´Â ÇÏÁö¸¸ ÀÌ ½º·¹µå ¶ÇÇÑ ¾ç³¯ÀÇ Ä®ÀÌ´Ù. Àß »ç¿ëÇÏ¸é ¹®Á¦°¡ ¾øÁö¸¸ À߸ø »ç¿ëÇϸé ÀÛ¾÷À» »¡¸® ³¡³»´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÀÈ÷·Á ½Ã½ºÅÛÀÇ ¼Óµµ¸¦ ¶³¾î¶ß¸± ¼öµµ ÀÖ´Ù. ¾Æ¹«¸® ¸ÖƼŽºÅ·, ¸ÖƼ½º·¹µå¸¦ Áö¿øÇÏ´Â OS¶ó°í Çصµ °á±¹Àº ÇÑÁ¤µÈ ÀÚ¿øÀÎ CPU¸¦ ³ª´²¼­ »ç¿ëÇÏ´Â °ÍÀÏ »ÓÀÌ´Ù. ¾î¶² ÄÄÇ»ÅÍ¿¡ 5°³ÀÇ ÇÁ·Î±×·¥°ú ÀÌ ÇÁ·Î±×·¥µé¿¡¼­ ¸¸µç 100¿© °³ÀÇ ½º·¹µå°¡ ½ÇÇàÁßÀ̶ó°í ÇÒ ¶§ ±×³É º¸±â¿¡´Â ¸ðµÎ µ¿½Ã¿¡ ½ÇÇàÀÌ µÇ°í ÀÖ´Â °Íó·³ º¸ÀÌÁö¸¸ ½ÇÁ¦·Î´Â ±× ÄÄÇ»ÅÍ¿¡ CPU°¡ Çϳª°¡ ¼³Ä¡µÇ¾î ÀÖ´ø 2°³ ¶Ç´Â 8°³ ÀÌ»óÀÇ CPU°¡ ´Þ·ÁÀÖ´øÁö °á±¹Àº Á¦ÇÑµÈ CPUÀÇ ÆÄ¿ö¸¦ ŸÀÓ½½¶óÀ̽º(time slice)·Î ÂÉ°³¼­ »ç¿ëÇÏ°í ÀÖ´Â °Í»ÓÀÌ´Ù. ¾Æ¹«¸® Àß ¸¸µé¾îÁø ¸ÖƼŽºÅ· OS¶óµµ CPU¶ó´Â ÇÑÁ¤µÈ ÀÚ¿øÀ» ³ª´² »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º¿Í ½º·¹µåµéÀÌ ¼­·Î ±ä¹ÐÇÏ°Ô ÇùÁ¶Çϸ鼭 ½ÇÇàµÇ°Ô ¸¸µé¾îÁöÁö ¾Ê´Â´Ù¸é Á¦´ë·Î ÀÛµ¿ÇÏÁö ¾Ê°Ô µÈ´Ù. ¸®½ºÆ® 1Àº °£´ÜÇÑ ¿¹Á¦Áö¸¸ OSÀÇ ÀÛµ¿À» °ÅÀÇ ¸ØÃß°Ô ÇÒ ¼ö ÀÖ´Ù. beginthreadex() ÇÔ¼ö´Â À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ »õ·Î¿î ½º·¹µå¸¦ ½ÃÀÛÇÏ°Ô ÇÏ´Â ÇÔ¼ö´Ù. _beginthreadÀÇ ¼¼ ¹ø° ÆĶó¹ÌÅÍ´Â »õ·Î¿î ½º·¹µå·Î ½ÇÇàµÉ ·çƾÀÇ ½ÃÀÛ ÁÖ¼ÒÀÌ°í ³× ¹ø° ÆĶó¹ÌÅÍ´Â ÀÌ ·çƾÀÇ º¯¼ö°ªÀÌ´Ù. ¸®½ºÆ® 1Àº ¾Æ¹« °Íµµ ÇÏÁö ¾Ê°í ¹«ÇÑ·çÇÁ¸¦ µµ´Â ½º·¹µå 3,000°³¸¦ ¸¸µå´Â ÇÁ·Î±×·¥ÀÌ´Ù. ºñÁÖ¾ó C++°¡ ±ò·Á ÀÖ´Ù¸é ÄÄÆÄÀÏÇÏ°í ½ÇÇàÇÏÀÚ(ÀÌ ±â»çÀÇ ¸ðµç ¿¹Á¦´Â ºñÁÖ¾ó C++ 6.0À» ±âÁØÀ¸·Î ¸¸µé¾îÁ³´Ù). C:\>cl /MDd test.c (/MDdÀº ¸ÖƼ½º·¹µå ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù´Â ¿É¼Ç) C:\>test ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°¸é ½ÇÇàȯ°æÀÇ OS°¡ À©µµ¿ì NT 4.0ÀÌ°Ç À©µµ¿ì 2000ÀÌ°Ç ¹Ù·Î ´Ù¿îµÈ´Ù. ¹°·Ð OS°¡ ¿ÏÀüÈ÷ ´Ù¿îµÇ´Â °ÍÀº ¾Æ´Ï°í CPUÀÇ ´ëºÎºÐÀ» 3,000°³ÀÇ ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â ¹«ÇÑ·çÇÁ°¡ Â÷ÁöÇϱ⠶§¹®¿¡ ŽºÅ© ½ºÀ§ÄªÀ̳ª »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ÀüÇô ¹ÞÁö ¸øÇÏ´Â »óÅ°¡ µÈ´Ù. Áï, »ç¿ëÀÚÀÇ ÀÔÀå¿¡¼­´Â ¾î¶² ÀԷ¿¡µµ ¹ÝÀÀÇÏÁö ¾Ê°í test.exe¸¦ Á×À̱â À§ÇØ Å½ºÅ© ¸Å´ÏÀú¸¦ ¶ç¿ì·Á°í Çصµ ¾Æ¹«·± ¹ÝÀÀÀÌ ¾ø´Â, »ç½Ç»ó ½Ã½ºÅÛÀÌ Á×Àº »óÅ°¡ µÈ´Ù. ¾Æ¹«¸® ¸ÖƼŽºÅ· OS¶ó°í Çصµ ÇÁ·Î¼¼½º°¡ ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â ¹«ÇÑ·çÇÁ while (1) { }À» ½ÇÇà½ÃÅ°¸é Àüü ½Ã½ºÅÛÀÇ ¼Óµµ°¡ ¸¹ÀÌ ¶³¾îÁúÅÙµ¥ ÀÌ·± ·çƾ 3,000°³°¡ µ¿½Ã¿¡ µ¹¾Æ°£´Ù°í »ý°¢ÇÏ¸é ´ç¿¬ÇÑ °á°úÀÌ´Ù. ´ÙÀ½Àº ¾à°£ ´Ù¸¥ ¹öÀüÀÇ thread() ÇÔ¼ö´Ù. unsigned __stdcall thread(void* arg) { while (1) { _sleep(50); } return 0; } _sleep() ÇÔ¼ö´Â ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º¸¦ Àá½Ã ´ë±â»óÅ°¡ µÇ°Ô ÇÏ´Â ÇÔ¼ö´Ù. ÆĶó¹ÌÅÍ´Â ´ë±â»óÅ·ΠÀÖ´Â ½Ã°£ÀÌ´Ù(´ÜÀ§´Â ¹Ð¸®ÃÊ). ÆĶó¹ÌÅÍ·Î 1,000À» ÁÖ¸é 1Ãʵ¿¾È, 60,000À» ÁÖ¸é 1ºÐµ¿¾È ´ë±â»óÅ°¡ µÈ´Ù(´ë±â»óÅ¿¡ ÀÖ´Â ½º·¹µå³ª ÇÁ·Î¼¼½º´Â CPU¸¦ °ÅÀÇ »ç¿ëÇÏÁö ¾Ê´Â´Ù). ±×·¡¼­ À§ÀÇ ·çƾÀº 0.05Ãʸ¶´Ù Çѹø¾¿ ·çÇÁ¸¦ µ¹°Ô µÈ´Ù. ´Ù½Ã ÄÄÆÄÀÏÇؼ­ ½ÇÇà½ÃÄѺ¸¸é »ç¿ëÇÏ´Â ½Ã½ºÅÛ¸¶´Ù ¾à°£¾¿ ´Ù¸£°ÚÁö¸¸ ´À·ÁÁö´Â ´À³¦ÀÌ µé±â´Â Çصµ º°´Ù¸¥ ¹«¸®¾øÀÌ PC¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸ÖƼ Ç÷¹ÀÌ¾î ¿Â¶óÀÎ °ÔÀÓÀÇ ¼­¹ö»Ó¸¸ÀÌ ¾Æ´Ï¶ó ´Ù¸¥ ¹ü¿ëÀûÀÎ ¸ñÀûÀÇ ¸ÖƼÀ¯Àú¿ë ÇÁ·Î±×·¥ÀÇ ¼­¹ö¶óµµ À§¿Í °°Àº °ú´ÙÇÑ ½º·¹µåÀÇ »ç¿ë¹®Á¦¿¡ ºÎµúÈ÷°Ô µÈ´Ù. µ¿½Ã¿¡ ¿©·¯ ¸íÀÇ »ç¿ëÀÚ°¡ Á¢¼ÓÇßÀ» ¶§ À̵éÀÇ ¿ä±¸¿¡ µ¿½Ã¿¡ ÀÀ´äÇϱâ À§Çؼ­´Â ½º·¹µåÀÇ »ç¿ëÀÌ Çʼö°ÚÁö¸¸ ¼ö½Ê °³ÀÇ ½º·¹µå¸¦ ¸¸µé°í ¹«ÇÑÁ¤ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ±â´Ù¸± ¼ö´Â ¾ø´Ù. µ¿½Ã À¯Àú°¡ 1,000¸íÀÌ µÉ °ÍÀ̶ó°í °¡Á¤ÇÏ°í 1,000°³ÀÇ ½º·¹µå¸¦ ¸¸µç´Ù¸é ÀÌ·ÐÀûÀ¸·Î´Â ¸ÂÁö¸¸ ³î°í ÀÖ´Â ½º·¹µåµéÀÌ CPU¸¦ ´ëºÎºÐ »ç¿ëÇϹǷΠ¼­ºñ½ºÀÇ Àüü ¼Óµµ´Â ¶³¾îÁú °ÍÀÌ È®½ÇÇÏ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ¸·±â À§ÇØ »ç¿ëÀÚ°¡ Á¢¼ÓÇÒ ¶§¸¶´Ù ½º·¹µå¸¦ ¸¸µç´Ù°í Çصµ, ¸¸¾à ÀÌ ½º·¹µå°¡ ÇÊ¿äÇÏÁö ¾ÊÀº °æ¿ì¿¡µµ ½ÇÇàÀÌ µÇ°í ÀÖ´Ù¸é °°Àº ¹®Á¦¿¡ ºÀÂøÇÏ°Ô µÈ´Ù. µû¶ó¼­ ÃæºÐÇÑ ¼öÀÇ ½º·¹µå¸¦ ¸¸µé¾î ½º·¹µå Ç®¿¡ ³ÖÀº ÈÄ¿¡ ÀÌ ½º·¹µåµéÀ» »ç¿ëÇϱâ Àü±îÁö´Â ´ë±â»óÅ¿¡ ÀÖ°Ô ÇÏ´Â ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù. _sleep()Àº ƯÁ¤ ½Ã°£µ¿¾È ´ë±â»óÅ¿¡ ÀÖ°Ô ÇÏÁö¸¸ ÇÁ·Î±×·¡¸Ó°¡ Á¤ÇÑ Æ¯Á¤ÇÑ ¶§¿¡¸¸ ½º·¹µå³ª ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ°Ô ÇÏ°í ½Í´Ù¸é Win32ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®(event object)¸¦ »ç¿ëÇÏ¸é µÈ´Ù. À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇϸé ÇÊ¿äÇÏÁö ¾ÊÀ» ¶§´Â ´ë±â»óÅ¿¡ µÎ¾ú´Ù°¡ ÇÊ¿äÇÒ ¶§ À̺¥Æ®¸¦ ¹ß»ý½ÃÄÑ ÇÁ·Î¼¼½º¸¦ ±ú¿ï ¼ö ÀÖ´Ù(¸®½ºÆ® 2). CreateEvent()´Â À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ¸¸µå´Â Win32 ÇÔ¼öÀ̸ç, SetEvent()´Â À̺¥Æ®¸¦ ¹ß»ý½ÃÅ°´Â Win32 API ÇÔ¼ö´Ù. WaitForSingleObject() ÇÔ¼ö´Â ÇϳªÀÇ Æ¯Á¤ À̺¥Æ®¸¦ ±â´Ù¸®´Â ÇÔ¼ö·Î ù ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± À̺¥Æ® ¿ÀºêÁ§Æ®ÀÇ ÇÚµé, µÎ ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± ½Ã°£ÀÌ´Ù(´ÜÀ§´Â ¹Ð¸®ÃÊ). µÎ ¹ø° ÆĶó¹ÌÅ͸¦ 1,000À¸·Î ÁÖ¸é WaitSingleObject() ÇÔ¼ö´Â 1Ãʵ¿¾È À̺¥Æ®°¡ ÀϾ±â¸¦ ±â´Ù¸°´Ù. INFINITE´Â winbase.h¿¡ ¹Ì¸® ¼±¾ðµÇ¾î ÀÖ´Â »ó¼ö·Î À̺¥Æ®¸¦ ¹«ÇÑÈ÷ ±â´Ù¸®°Ô µÈ´Ù. WaitForSingleObject()´Â Á¤ÇØÁø ½Ã°£¿¡ ±â´Ù¸®´Â À̺¥Æ®°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸é WAIT_TIMEOUTÀ» ¸®ÅÏÇÑ´Ù. CreateEvent() ÇÔ¼öÀÇ µÎ ¹ø° ÆĶó¹ÌÅÍ´Â À̺¥Æ®°¡ ¹ß»ýÇÑ ÈÄ¿¡ À̺¥Æ®ÀÇ ½ÅÈ£(signal)¸¦ ¸®¼ÂÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ÀÚµ¿À¸·Î ¸®¼ÂµÉ °ÍÀÎÁö¸¦ TRUE(1)/FAL SE(0) °ªÀ¸·Î °áÁ¤ÇÑ´Ù. À̺¥Æ® ½ÅÈ£(signal)´Â ±³Åë½ÅÈ£µîÀÇ ½ÅÈ£¿Í °°Àº °ÅÀÇ °°Àº Àǹ̴Ù. Ⱦ´Üº¸µµ¿¡¼­ ÆĶõºÒÀ» ±â´Ù¸®´Â ÀÚµ¿Â÷ó·³ WaitForSingle Object()¿¡ ÀÖ´Â ÇÁ·Î¼¼½º³ª ½º·¹µå´Â ½ÅÈ£(signal)°¡ µé¾î¿À±â¸¦ ±â´Ù¸®°í ÀÖ´Ù. ÀÌ °ªÀ» TRUE(1)·Î ÁÖ¸é Çѹø ½ÅÈ£°¡ µé¾î°£ ÈÄ¿¡µµ °è¼Ó ½ÅÈ£µîÀº ÆĶõºÒÀÎ »óÅ·Π³²¾ÆÀÖ°Ô µÈ´Ù. ±×·¡¼­ µÚ¿¡ ´ë±â ÁßÀÌ´ø Â÷µéµµ °è¼Ó Åë°úÇÏ´Â °ÍÀÌ´Ù. ÀÌ ½ÅÈ£¸¦ ¸®¼ÂÇϱâ À§Çؼ­´Â ÇÁ·Î±×·¡¸Ó°¡ ResetEvent() ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ À̺¥Æ®ÀÇ ½ÅÈ£(signal)¸¦ ¸®¼ÂÇØ¾ß ÇÑ´Ù. FALSE(0)·Î ÁÖ¸é ÀÚµ¿À¸·Î ¸®¼ÂÀÌ µÈ´Ù. Áï, ÇÑ´ëÀÇ ÀÚµ¿Â÷°¡ Åë°úÇÏ°í ³ª¸é ½ÅÈ£µîÀº ´Ù½Ã Áï½Ã »¡°£ºÒÀÌ µÇ¾î Çѹø¿¡ ÇÑ´ëÀÇ ÀÚµ¿Â÷¸¸ Áö³ª°¡°Ô µÈ´Ù. À̺¥Æ® ¿ÀºêÁ§Æ®ÀÇ ¸ðµç »ç¿ëÀÌ ³¡³ª¸é CloseHandle() ÇÔ¼ö·Î ¿ÀºêÁ§Æ®¸¦ ´Ù½Ã Ä¿³Î¿¡ ¹ÝȯÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ °ÍÀº Win32 ·¹ÆÛ·±½º °¡À̵峪 ºñÁÖ¾ó C++ ÇïÇÁ¸¦ Âü°íÇϱ⠹ٶõ´Ù. ¸®½ºÆ® 2¸¦ ÄÄÆÄÀÏÇؼ­ ½ÇÇàÇÏ°í ¡®h¡¯Å°¸¦ ´©¸£¸é ¡®Hello world!¡¯¸¦ µµ½ºÃ¢¿¡ Ãâ·ÂÇÏ°í ¡®c¡¯Å°¸¦ ´©¸£¸é ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¸é óÀ½¿¡´Â thread() ·çƾÀº WaitSingleObject() ÇÔ¼ö¿¡¼­ hEvent À̺¥Æ®¸¦ ¹«ÇÑÈ÷ ±â´Ù¸®°Ô µÈ´Ù. »ç¿ëÀÚ°¡ ¡®h¡¯Å°¸¦ ´©¸£¸é SetEvent() ÇÔ¼ö·Î hEvent À̺¥Æ®¸¦ ¹ß»ýÇÏ°í thread()´Â ´ë±â»óÅ¿¡¼­ ºüÁ®³ª¿Í printf(¡°Hello world!¡±)¸¦ ½ÇÇàÇÏ°í ´Ù½Ã WaitSingleObject() ÇÔ¼ö¿¡¼­ ¹«ÇÑÈ÷ hEvent ÇÔ¼ö¸¦ ±â´Ù¸®°Ô µÈ´Ù. ¡®c¡¯°ªÀ» ´­·¯ ·çÇÁ¸¦ ¹þ¾î³ª¸é ÇÁ·Î±×·¥Àº ³¡³­´Ù. À̶§ µû·Î ½º·¹µå¸¦ ´ÝÁö ¾Ê¾Æµµ thread()¸¦ ½ÇÇàÁßÀÎ ½º·¹µå´Â ¸ÞÀÎ ÇÁ·Î¼¼½ºÀÇ ÀÚ½Ä ÇÁ·Î¼¼½ºÀ̱⠶§¹®¿¡ OS¿¡ ÀÇÇØ ÀÚµ¿À¸·Î ¾ø¾îÁø´Ù. ÇÏÁö¸¸ thread() ½º·¹µå°¡ ³¡³ª°í µ¥ÀÌÅÍÀÇ ÃʱâÈ­³ª ´Ù¸¥ ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ ¶§´Â ¾î¶»°Ô ÇÒ±î? ¸®½ºÆ® 3À» º¸ÀÚ. ¸®½ºÆ® 2¿¡¼­ ÇÑ °³ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÑ °Í¿¡ ¹ÝÇØ ¸®½ºÆ® 3Àº 3°³ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. Çѹø¿¡ ¿©·¯ °³ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ±â´Ù¸®±â À§ÇØ À̺¥Æ® ¿ÀºêÁ§Æ® Win32 API ÇÔ¼ö Áß¿¡¼­ WaitFor MultipleObjects() ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. WaitFor MultipleObjects()´Â WaitForSingleObject()¿Í ´Þ¸® ÇϳªÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®°¡ ¾Æ´Ï¶ó ÇÑ °³ ÀÌ»óÀÇ ¿©·¯ °³ÀÇ À̺¥Æ®¸¦ ±â´Ù¸± ¼ö ÀÖ´Ù. WaitForMultipleObjects() ÇÔ¼öÀÇ Ã¹ ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± À̺¥Æ®ÀÇ °³¼ö, µÎ ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± ¿ÀºêÁ§Æ®µé, ¼¼ ¹ø° ÆĶó¹ÌÅÍ´Â ¿©·¯ °³ÀÇ ¿ÀºêÁ§Æ® Áß Çϳª¸¦ ±â´Ù¸± °ÍÀÎÁö ¾Æ´Ï¸é ¿©·¯ °³ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ¸ðµÎ ±â´Ù¸± °ÍÀÎÁö¸¦ Á¤ÇÑ´Ù. ÀÌ °ªÀ» TRUE(1) °ªÀ¸·Î ¼³Á¤ÇÏ¸é ±â´Ù¸®°í ÀÖ´Â ¿©·¯ À̺¥Æ®°¡ ¸ðµÎ ¹ß»ýÇØ¾ß ´ë±â»óŸ¦ ºüÁ®³ª°¡°í, FALSE(0) °ªÀ» ÁÖ¸é ±â´Ù¸®°í ÀÖ´Â À̺¥Æ®µé Áß¿¡¼­ ÇϳªÀÇ À̺¥Æ®¸¸ ¹ß»ýÇصµ ´ë±â»óŸ¦ ¹þ¾î³ª°Ô µÈ´Ù. WaitForMultipleObjects() ÇÔ¼öÀÇ ¸®ÅÏ°ªÀº ¹ß»ýÇÑ À̺¥Æ®ÀÇ À妽º°ªÀ̳ª ¿¡·¯°¡ ¹ß»ýÇÒ °æ¿ìÀÇ ¿¡·¯ÄÚµå´Ù. ¸®½ºÆ® 3¿¡¼­´Â ¸¸¾à hHelloEvent À̺¥Æ®°¡ ¹ß»ýÇϸé 0À», hByeEvent À̺¥Æ®°¡ ¹ß»ýÇϸé 1À» ¸®ÅÏÇÑ´Ù. ¸®½ºÆ® 2 : À̺¥Æ® ¿ÀºêÁ§Æ® ¸®½ºÆ® 3À» ÄÄÆÄÀÏÇÏ°í ½ÇÇà½ÃŲ ÈÄ ¡®h¡¯Å°¸¦ ´©¸£¸é SetEvent(hHelloEvent)°¡ hHelloEvent¸¦ ¹ß»ýÇؼ­ µµ½ºÃ¢¿¡ ¡®Hello world!¡¯¸¦ Ãâ·ÂÇÏ´Â °ÍÀº ¸®½ºÆ® 2¿Í °°Áö¸¸ ¡®c¡¯Å°¸¦ ´©¸£¸é hByeEvent À̺¥Æ®°¡ ¹ß»ýµÈ´Ù. WaitForMultipleObjects()´Â hHelloEvent À̺¥Æ® »Ó¸¸ ¾Æ´Ï¶ó hByeEvent À̺¥Æ® ¿ª½Ã ±â´Ù¸®°í ÀÖÀ¸¹Ç·Î ·çÇÁ¸¦ ¹þ¾î³ª ¡®Bye¡¯Ãâ·ÂÀ» ÇÏ°í hCloseEvent À̺¥Æ®¸¦ ¹ß»ý½ÃŲ´Ù. À̶§ main()¿¡¼­´Â ¡®c¡¯Å°¸¦ ´­·¶±â ¶§¹®¿¡ ·çÇÁ¸¦ ¹þ¾î³ª¼­ ´ÙÀ½ ¶óÀο¡ ÀÖ´Â WaitFor SingleObject(hCloseEvent, INFINITE); ¿¡¼­ hClos eEvent À̺¥Æ®¸¦ ±â´Ù¸®°í Àֱ⠶§¹®¿¡ ´ë±â»óÅ¿¡¼­ ¹þ¾î³ª°Ô µÈ´Ù. ÇÁ·Î±×·¥Àº ¡®Cloed¡¯¸¦ Ãâ·ÂÇÏ°í Á¾·áµÈ´Ù. ¸ÖƼ½º·¹µå ÇÁ·Î±×·¡¹Ö¿¡¼­´Â ÀÌ¿Í °°ÀÌ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ÀÌ¿ëÇϰųª Àü¿ªº¯¼ö¸¦ »ç¿ëÇÏ¸é ½º·¹µå °£ Åë½Å ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ¿Ü¿¡µµ ¿©·¯ °³ÀÇ ½º·¹µå°¡ °°Àº µ¥ÀÌÅ͸¦ »ç¿ëÇÒ ¶§ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î A, B, C 3°³ÀÇ ½º·¹µå°¡ int data = 0; ÀÇ °ªÀ» ¸ðµÎ °øÅëÀ¸·Î »ç¿ëÇÑ´Ù°í ÇÒ ¶§, µ¿½Ã¿¡ 2°³ÀÇ ½º·¹µå°¡ data¿¡ 1À» ´õÇÏ´Â ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÑ´Ù¸é dataÀÇ °ªÀÌ 1ÀÌ µÉ °ÍÀÎÁö ¾Æ´Ï¸é 2°¡ µÉ °ÍÀÎÁö´Â ¾Æ¹«µµ ¸ð¸¥´Ù. ÀÌ·¸°Ô ½º·¹µåµéÀÌ »ç¿ëÇÏ´Â µ¥ÀÌÅÍ°¡ ¼ýÀÚ°ªÀ̶ó¸é ±×³É Ʋ¸®´Â ¹®Á¦·Î ³Ñ¾î°¡°ÚÁö¸¸ ¸¸¾à ¸µÅ©µå ¸®½ºÆ®³ª Æ®¸®°°Àº µ¥ÀÌÅÍ ±¸Á¶ÀÏ ¶§´Â ¿îÀÌ ÁÁÀ¸¸é µ¥ÀÌÅÍÀÇ ±¸Á¶°¡ ±úÁú °ÍÀÌ°í, ¿îÀÌ ³ª»Ú´Ù¸é ÇÁ·Î±×·¥ ÀÚü°¡ access violation ¿¡·¯¸¦ ¹ß»ý½ÃÅ°°í ´Ù¿îµÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇϱâ À§ÇØ Win32 API¿¡´Â µ¿±âÈ­ ÇÔ¼öµé(Synchronization Functions)ÀÌ ÁغñµÇ¾î ÀÖ´Ù. ÀÌ ±Û¿¡¼­´Â ¸ðµç ÇÔ¼öµé°ú ¿ÀºêÁ§Æ®µéÀ» ´Ù·ê ¼ö´Â ¾ø±â ¶§¹®¿¡ CRITICAL_SECTION°ú Interlocked ÇÔ¼öµé¸¸ ´Ù·çµµ·Ï ÇÏ°Ú´Ù(Win32 µ¿±âÈ­ ÇÔ¼öµé¿¡ ´ëÇØ ´õ ¾Ë°í ½ÍÀº »ç¶÷µéÀº Win32 API ·¹ÆÛ·±½º ¸Å´º¾óÀ» ã¾Æº¸°Å³ª MSDN À¯Àú´Â µ¿±âÈ­(Synchronization)Ç׸ñÀ» ã¾Æº¸±â ¹Ù¶õ´Ù). Å©¸®Æ¼Äà ¼½¼Ç(Critical section)Àº Áß´ë, Ä¡¸íÀûÀ̶ó´Â CriticalÀÇ Àǹ̴ë·Î ÇÁ·Î±×·¥ ³»¿¡ Çѹø¿¡ ÇÑ °³ÀÇ ½º·¹µå¸¸ ÁøÀÔÀÌ ÇÊ¿äÇÑ ¿µ¿ªÀ» ÀǹÌÇÑ´Ù. Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î Á¤ÀÇµÈ ¿µ¿ªÀº ¾î¶² ½º·¹µå°¡ Å©¸®Æ¼Äà ¼½¼Ç¿¡ µé¾î°¡·Á°í Çصµ ÀÌ¹Ì ´Ù¸¥ ½º·¹µå°¡ ÀÌ ¿µ¿ª¿¡ µé¾î°¡ ÀÖ´Â »óŶó¸é µÚ¿¡ ÁøÀÔÇÏ·Á´Â ½Ãµµ¸¦ Çß´ø ½º·¹µå´Â ´ë±â»óÅ·Πµé¾î°£´Ù. ±×¸®°í ¸ÕÀú ÀÌ ¿µ¿ª¿¡ µé¾î°¬´ø ½º·¹µå°¡ ÀÌ ¿µ¿ªÀ» ¹þ¾î³ª¸é ´ë±â»óÅ¿¡ ÀÖ´ø ½º·¹µå´Â Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î µé¾î°¡°Ô µÈ´Ù. Win32¿¡¼­ Å©¸®Æ¼Äà ¼½¼ÇÀº Äڵ忡¼­ Å©¸®Æ¼Äà ¼½¼ÇÀ̶ó°í Á¤ÀÇÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó(C³ª C++¿¡´Â ºÒÇàÈ÷ ÀÌ·± ¹®¹ýÀÌ ¾ø´Ù) CRITICAL_SECTIONÀ̶ó´Â ½ºÆ®·°Ã³¸¦ ÀÌ¿ëÇؼ­ °¡»óÀ¸·Î Á¤ÀÇÇؼ­ »ç¿ëÇÑ´Ù. Áï, °°Àº CRITICAL_SECTION ½ºÆ®·°Ã³¸¦ »ç¿ëÇÏ´Â ½º·¹µå´Â °°Àº Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÁøÀÔÇÏ´Â ½º·¹µå·Î °£ÁֵȴÙ. Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î µé¾î°¡´Â API´Â Enter Critical Section(), ¹þ¾î³µ´Ù°í ¾Ë¸®´Â API´Â Leave CriticalSec tion()ÀÌ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ ¿¹Á¦¸¦ ÅëÇØ »ìÆ캸ÀÚ. Interlocked ÇÔ¼ö´Â À̸§ÀÌ Interlocked·Î ½ÃÀ۵Ǵ ÇÔ¼öµé·Î ƯÁ¤ 32ºñÆ® º¯¼ö¿¡ ´ëÇØ ÇÑ °³ ÀÌ»óÀÇ ½º·¹µå°¡ µ¿½Ã¿¡ Á¢±ÙÇÏ´Â °ÍÀ» ¸·´Â ÇÔ¼öµéÀÌ´Ù. Interlocked ÇÔ¼öµéÀº ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù. InterlockedCompareExchange InterlockedCompareExchangePointer InterlockedDecrement InterlockedExchange InterlockedExchangeAdd InterlockedExchangePointer InterlockedIncrement ÀÌ Áß ¿¹Á¦¿¡¼­ »ç¿ëÇÒ InterlokcedIncrement¸¦ º¸ÀÚ. ÇÔ¼öÀÇ ½ºÆåÀº ¾Æ·¡¿Í °°´Ù. ÀÌ ÇÔ¼ö´Â 32ºñÆ® º¯¼ö°ªÀ» 1 Áõ°¡½ÃÅ°´Â ±â´ÉÀ» ÇÑ´Ù. LONG InterlockedIncrement(LPLONG lpAddend); ÆĶó¹ÌÅÍ´Â 32ºñÆ® º¯¼öÀÇ ÁÖ¼ÒÀÌ°í ¸®ÅÏ°ªÀº Áõ°¡µÈ°ªÀÌ´Ù. Áï int nNumber = 1; int nResult; nResult = InterlockedIncrement((long*) &nNumber); ÀÇ °á°ú´Â nNumber°ªÀº 2°¡ µÇ°í nResult¿¡µµ nNumberÀÇ Áõ°¡°ªÀÎ 2°¡ ÀúÀåµÈ´Ù. ¾Æ·¡ ¿¹Á¦´Â Critical section°ú Interlocked ÇÔ¼ö¸¦ »ç¿ëÇÑ ÇÑ °³ÀÇ µ¥ÀÌÅÍ°ªÀ» ¿©·¯ °³ÀÇ ½º·¹µå°¡ µ¿½Ã¿¡ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¸®½ºÆ® 4´Â 10°³ÀÇ ½º·¹µå°¡ ÇϳªÀÇ º¯¼ö int dataÀ» ·£´ýÇÑ ½Ã°£ °£°Ý(0~1000¹Ð¸®ÃÊ)À¸·Î 1¾¿ Áõ°¡½ÃÅ°°í À̸¦ È­¸é¿¡ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. À̶§ Å©¸®Æ¼Äà ¼½¼ÇÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é int dataÀÇ °ªÀÌ ¾î¶»°Ô µÉ±î? data++ ¿ÀÆÛ·¹À̼ÇÀº ½ÇÇà½Ã°£ÀÌ Âª±â ¶§¹®¿¡ data=1, data=2, data=3... ¼øÀ¸·Î È­¸é¿¡ ±×·ÁÁú °ÍÀÌ´Ù. ³·Àº È®·üÀÌÁö¸¸ µ¿½Ã¿¡ 2°³ ÀÌ»óÀÇ ½º·¹µå°¡ int data°ªÀ» ¹Ù²ã data=1022, data=1022, data=1023°ú °°Àº °á°ú°¡ ³ª¿ÃÁöµµ ¸ð¸¥´Ù. Win32 Critical section API¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº InitializeCriticalSection()À¸·Î CRITICAL_SECT ION ½ºÆ®·°Ã³¸¦ ÃʱâÈ­ÇÏ°í Å©¸®Æ¼Äà ¼½¼Ç¿¡ µé¾î°¥ ¶§´Â EnterCriticalSection() ÇÔ¼ö¸¦ »ç¿ëÇÏ°í, ³ª¿Ã ¶§´Â LeaveCriticalSection() ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. »ç¿ëÀÌ ³¡³µ´Ù¸é DeleteCriticalSection()À¸·Î Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ®¸¦ Á¦°ÅÇÑ´Ù. ¸®½ºÆ® 4¸¦ ÄÄÆÄÀÏÇÏ°í ½ÇÇà½ÃÅ°¸é data=1 data=2 data=3... ÀÌ È­¸é¿¡ °è¼Ó Ãâ·ÂµÇ°í ¾Æ¹«Å°³ª ´©¸£¸é ½ÇÇàÀÌ Á¾·áµÉ °ÍÀÌ´Ù. main()¿¡¼­´Â 0.5ÃÊ °£°ÝÀ¸·Î Á¾·á°¡ ³¡³­ ½º·¹µåÀÇ ¼ýÀÚ¸¦ üũÇÏ¸ç ·çÇÁ¸¦ µ¹´Ù ¸ðµç ½º·¹µå Á¾·á°¡ È®ÀεǸé ÇÁ·Î±×·¥À» ³¡³»°Ô µÈ´Ù. Á¾·áµÈ ½º·¹µåÀÇ ¼ýÀÚ´Â InterlockedIncrement()¸¦ »ç¿ëÇؼ­ Áõ°¡½ÃŲ´Ù. µ¿½Ã¿¡ ¿©·¯ °³ÀÇ ½º·¹µå°¡ int closethreadÀÇ °ªÀ» Áõ°¡½ÃÅ°·Á Çصµ Çѹø¿¡ ÇϳªÀÇ ½º·¹µå¸¸ int closedthreadÀÇ °ªÀ» Áõ°¡½ÃÅ°±â ¶§¹®¿¡ µ¥ÀÌÅÍÀÇ ¹«°á¼ºÀº º¸ÀåµÈ´Ù. ¸®½ºÆ® 4¿¡¼­ »ç¿ëÇÑ Å©¸®Æ¼Äà ¼½¼ÇÀ̳ª ´Ù·çÁö ¾ÊÀº ¼¼¸¶Æ÷¾î(semaphore), ¹ÂÅؽº(mutex) µîÀÇ µ¿±âÈ­(Synchronization) ¹æ¹ýÀ» »ç¿ëÇÏ¸é ¸ÖƼ½º·¹µå ÇÁ·Î±×·¥¿¡¼­ ´Ù¼öÀÇ ½º·¹µå°¡ ÇϳªÀÇ °ø¿ë µ¥ÀÌÅ͸¦ »ç¿ëÇÑ °Í¿¡ ´ëÇÑ ¹«°á¼ºÀ» º¸ÀåÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ Å©¸®Æ¼Äà ¼½¼Ç, ¹ÂÅؽº, ¼¼¸¶Æ÷¾î µîÀ» ÀÌ¿ëÇؼ­ ƯÁ¤ µ¥ÀÌÅÍ »ç¿ë Àü¿¡ ¶ô(lock)À» °É°í µ¥ÀÌÅÍÀÇ »ç¿ëÀÌ ³¡³­ ÈÄ¿¡ ¶ô(lock)À» Ǫ´Â °ÍÀ¸·Î µ¥ÀÌÅÍÀÇ ¹«°á¼ºÀ» º¸ÀåÇÒ ¼ö ÀÖÀ»Áö ¸ð¸£Áö¸¸, ¿©·¯ °³ÀÇ ¶ôÀ» »ç¿ëÇÒ ¶§ À߸øµÈ ¼ø¼­/¹æ¹ýÀ¸·Î »ç¿ëÇÒ °æ¿ì ½±°Ô µ¥µå¶ô(dead lock)À» ÃÊ·¡ÇÒ ¼öµµ ÀÖ´Ù. ¸®½ºÆ® 5¸¦ º¸ÀÚ. ¸®½ºÆ® 5ÀÇ µÎ ÄÚµå´Â °¡»óÀÇ ¸Ó±× ¼­¹ö¿¡¼­ µ¹¾Æ°¡´Â ÄÚµå·Î °ÔÀÓ ³»ÀÇ µ¥ÀÌÅͺ£À̽º¿¡ ¾×¼¼½ºÇÏ´Â ÄÚµåµéÀÌ´Ù. ÀÌ °¡»óÀÇ ¼­¹ö´Â µ¿½Ã¿¡ ¼ö¹é ¸íÀÇ »ç¿ëÀÚ¸¦ °¨´çÇϱâ À§ÇØ ¼ö½Ê °³ÀÇ ½º·¹µå¸¦ »ç¿ëÇÏ°í ÀÖ°í, °ÔÀÓ ³»ÀÇ Ä³¸¯ÅÍ°¡ Áװųª À̵¿/·Î±×ÀÎ/·Î±×¾Æ¿ôÇÏ°í ¾ÆÀÌÅÛÀÇ »ç¿ë/À̵¿ÀÌ ºó¹øÇϱ⠶§¹®¿¡ 2°³ÀÇ CRITICAL_SECTION cs1°ú cs2¸¦ »ç¿ëÇؼ­ À¯Àú µ¥ÀÌÅ͸¦ °ü¸®ÇÑ´Ù. cs1Àº À¯ÀúÀÇ µ¥ÀÌÅ͸¦, cs2´Â ¾ÆÀÌÅÛÀÇ µ¥ÀÌÅ͸¦ ¾×¼¼½ºÇÒ ¶§ »ç¿ëÇÏ´Â Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ®´Ù. ¾ð¶æ º¸±â¿¡´Â ¸Â´Â °Í °°´Ù. ÇÏÁö¸¸ ¸¸¾à X¶ó´Â ½º·¹µå°¡ ¸®½ºÆ® 5ÀÇ A ºÎºÐ¿¡¼­ cs2¸¦ »ç¿ëÇؼ­ cs2ÀÇ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î µé¾î°¡·Á°í ½ÃµµÁßÀÌ°í, Y¶ó´Â ½º·¹µå´Â B ºÎºÐ¿¡¼­ cs1ÀÇ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÁøÀÔÀ» ½ÃµµÇÏ°í ÀÖ´Ù¸é X ½º·¹µå°¡ cs2¸¦ ¹þ¾î³ª¾ß Y ½º·¹µå°¡ cs1¿¡ ÁøÀÔÇÒ ¼ö ÀÖ°í, X ½º·¹µå´Â Y ½º·¹µå°¡ cs1À» ¹þ¾î³ª¾ß cs2·Î µé¾î°¥ ¼ö ÀÖ´Ù. X ½º·¹µå¿Í Y ½º·¹µå°¡ ¼­·Î µ¹·ÁÁÙ ¼ö ¾ø´Â °ÍÀ» ±â´Ù¸®°í ÀÖÀ¸¹Ç·Î ¿µ¿øÈ÷ ±â´Ù·Á¾ß ÇÑ´Ù. ¸í¹éÇÑ µ¥µå¶ô(dead lock)ÀÌ´Ù. À§ÀÇ µ¥µå¶ôÀº ½¬¿î ÆíÀÌ¶ó ´©±¸³ª ½±°Ô ãÀ» ¼ö ÀÖ´Â °ÍÀÌÁö¸¸ ¼öõ ¸íÀÇ À¯Àú°¡ µ¿½Ã¿¡ Ç÷¹ÀÌ °¡´ÉÇÑ ¸Ó±× °ÔÀÓÀÇ ¼­¹öÀÏ °æ¿ì, Àüü ¼­¹ö¿¡ »ç¿ëµÇ´Â ¶ô(lock) ¿ÀºêÁ§Æ®ÀÇ ¼ýÀÚ°¡ µ¿½Ã Á¢¼ÓÁßÀÎ »ç¿ëÀÚÀÇ 2~3¹è°¡ µÇ´Â °æ¿ì°¡ ºó¹øÈ÷ ÀϾ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡ µ¥µå¶ôÀ» ¸·´Â °ÍÀº ¸Å¿ì ¾î·Æ´Ù. ÇÑ °³ÀÇ ½º·¹µå°¡ µ¥µå¶ôÀÌ µÉ °æ¿ì ¾ó¸¶ ÈÄ¿¡ µ¥µå¶ôÀÌ °É¸° ½º·¹µå¿¡ »ç¿ëµÈ ¶ô¿¡ Á¢±ÙÇÏ´Â ¸ðµç ½º·¹µå°¡ °°ÀÌ µ¥µå¶ô¿¡ ºüÁö°Ô µÈ´Ù. ÀÌ·± µ¥µå¶ô ¹®Á¦´Â ½ÇÇàȯ°æÀÇ º¹Àâµµ°¡ ¿Ã¶ó°¥¼ö·Ï ¹ß»ýÇÒ È®·üÀÌ ³ô¾ÆÁö±â ¶§¹®¿¡ µ¿½Ã Á¢¼ÓÀÚÀÇ ¼ýÀÚ°¡ ¸¹À» ¶§ ¹ß»ýÇϱ⠽±°í °°Àº ¼­¹ö ÇÁ·Î±×·¥ÀÌ¶óµµ »ç¿ëÀÚÀÇ ¼ýÀÚ°¡ Àû´Ù¸é ¹ß»ýÈ®·üÀÌ ³·´Ù. ÀÌ·± ¹ö±×´Â °³¹ß±â°£¿¡´Â ¹ß»ý ÀÚü°¡ Èûµé´Ù. ¼­ºñ½º¿Í µ¿ÀÏÇÑ Á¶°ÇÀ» ¸ÂÃß±â À§Çؼ­´Â Å×½ºÆ® ¿ä¿øÀ» ¼öõ ¸í¾¿ »Ì¾Æ¾ß Çϱ⠶§¹®¿¡ ã´Â °Í»Ó¸¸ ¾Æ´Ï¶ó µð¹ö±ëµµ ¸Å¿ì Èûµé´Ù. µû¶ó¼­ ÇÁ·Î±×·¡¸Ó´Â ÀÌ·¯ÇÑ ¶ô(lock) ¿ÀºêÁ§Æ®µéÀÇ »ç¿ë¿¡ ÀڽŸ¸ÀÇ ±ÔÄ¢À» ¼¼¿ì°í ÄÚµù ¶§´Â ¹Ýµå½Ã ÀÌ ¿øÄ¢À» ÁöÄѼ­ °³¹ßÀ» ÇؾßÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¸®½ºÆ® 5ÀÇ µ¥µå¶ô ¹®Á¦´Â µÎ °³ÀÇ Å©¸®Æ¼Äà ¼½¼ÇÀ» »ç¿ëÇÒ ¶§ ¹Ýµå½Ã cs1¸¦ Åë°úÇÑ ´ÙÀ½ cs2ÀÇ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÁøÀÔÇÏ´Â °ÍÀ¸·Î ÁøÀÔ ¼ø¼­¸¦ Á¤Çϸé ÇØ°áÀÌ °¡´ÉÇÏ´Ù. Áï, ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÏ¸é µ¥µå¶ôÀº ÇÇÇÒ ¼ö ÀÖ´Ù. EnterCriticalSection(&cs1); ... EnterCriticalSection(&cs2); ... LeaveCriticalSection(&cs2); ... LeaveCriticalSection(&cs1); ¸®½ºÆ® 4 : Critical section°ú interlocked ÇÔ¼ö Ŭ¶óÀ̾ðÆ® & ¼­¹ö ÇÁ·Î±×·¡¹Ö ±×·¡ÇÈ ¸Óµå´Â ÅؽºÆ® ¸Óµå¿¡¼­ ¹ßÀüÇÑ °ÍÀÌ°í ÅؽºÆ® ¸Óµå´Â äÆÿ¡¼­ ³ª¿Ô´Ù. ÀÌ·± ÁøÈ­°úÁ¤À» º¸¸é ±×·¡ÇÈ ¸ÓµåÀÇ ±âº»¿ø¸®°¡ »ç½ÇÀº äÆðú ±×·¸°Ô ´Ù¸£Áö ¾Ê´Ù°í »ý°¢ÇÒ ¼öµµ ÀÖ´Ù. ÃÖ±Ù¿¡ ½ÇÁ¦ »ó¿ë ¼­ºñ½º ÁßÀÎ ¿©·¯ äÆà ¼­ºñ½ºµéÀÌ Ã¤ÆÃÀÇ ¿ø·¡ ±â´ÉÀÎ ÅؽºÆ®ÀÇ Àü¼Û ÀÌ¿Ü¿¡ ¿©·¯ °¡Áö ºÎ°¡ ¼­ºñ½º¸¦ Áö¿øÇÏ°í ÀÖÁö¸¸, äÆà ¼­ºñ½ºÀÇ ±âº» ¼­ºñ½º´Â ¡®°°Àº äÆù濡 ÀÖ´Â »ç¶÷µé¿¡°Ô ÇÑ»ç¶÷ÀÌ Àü¼ÛÇÏ´Â ¹®ÀåÀ» ÀüÆÄÇÑ´Ù(broadcast)¡¯ÀÏ °ÍÀÌ´Ù. °£´ÜÇÑ ÇüÅÂÀÇ Ã¤Æü­¹ö¸¦ ¸¸µé°í ½Í´Ù¸é ¾Æ·¡ÀÇ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¼­¹ö ÇÁ·Î±×·¥À» ¸¸µé¸é µÈ´Ù. ¨ç ¼ÒÄÏÀ» ¿­°í »õ·Î¿î »ç¿ëÀÚ°¡ Á¢¼ÓÇÏ±æ ±â´Ù¸°´Ù. ¨è »ç¿ëÀÚ°¡ Á¢¼ÓÇϸé Á¢¼ÓÀÚ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. ¨é Á¢¼ÓÀÚ°¡ ¹®ÀåÀ» ¼­¹ö·Î º¸³»¸é ¸ðµç Á¢¼ÓÀÚ¿¡°Ô ¹®ÀåÀ» Àü¼ÛÇÑ´Ù. ¨ê Á¢¼ÓÀÌ ²÷±â¸é Á¢¼ÓÀÚ ¸®½ºÆ®¿¡¼­ »èÁ¦ÇÑ´Ù. Ŭ¶óÀ̾ðÆ® ÂÊÀº ¨ç ¼ÒÄÏÀ» ¿­°í ¼­¹ö¿¡ Á¢¼ÓÇÑ´Ù. ¨è »ç¿ëÀÚ°¡ ¹®ÀÚ¸¦ ÀÔ·ÂÇÏ°í ¿£ÅÍÅ°¸¦ Ä¡¸é ¼­¹ö¿¡ ¹®ÀÚ¿­À» Àü¼ÛÇÑ´Ù. ¨é ¼­¹ö¿¡¼­ ¹®ÀÚ¿­À» º¸³»¸é È­¸é¿¡ Ãâ·ÂÇÑ´Ù. Ŭ¶óÀ̾ðÆ® ÂÊÀº ¼ÒÄÏÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ¾à°£ÀÇ Áö½ÄÀÌ ÀÖ´Ù¸é ±×¸® ¾î·ÆÁö ¾Ê°Ô ±¸ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼­¹öÂÊ ±â´ÉµéÀº ¾Õ¿¡¼­ ´Ù·é ¸ÖƼ½º·¹µå¸¦ ÀÌ¿ë, 2°³ÀÇ ½º·¹µå ·çƾÀ» ¸¸µå´Â °ÍÀ¸·Î °£´ÜÈ÷ ±¸ÇöÀÌ °¡´ÉÇÏ´Ù. Çϳª´Â »ç¿ëÀÚÀÇ Á¢¼ÓÀ» ó¸®ÇÏ´Â ½º·¹µåÀÌ°í µÎ ¹ø°´Â Á¢¼ÓÇÑ »ç¿ëÀÚ¸¦ ó¸®ÇÏ´Â ½º·¹µåÀÌ´Ù. »ç¿ëÀÚÀÇ Á¢¼ÓÀ» ó¸®ÇÏ´Â ½º·¹µå¸¦ ServerThread¶ó ÇÏ°í Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÆÐŶó¸®¿Í ¼ÒÄÏ°ü¸®¸¦ ó¸®ÇÏ´Â ½º·¹µå¸¦ UserThread¶ó ºÎ¸£±â·Î ÇÏÀÚ. ÀÌ µÎ °³ÀÇ ½º·¹µå¸¦ °£´ÜÇÑ ½´µµ(suedo) ÄÚµå·Î Á¤ÀÇÇÏ¸é ¸®½ºÆ® 6°ú °°´Ù. ServerThread()´Â óÀ½¿¡ ¼­¹ö ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ ¶§ Çϳª°¡ ¸¸µé¾îÁø´Ù. ServerThread()´Â óÀ½¿¡ ¼ÒÄÏÀ» ÃʱâÈ­ÇÏ°í ÃʱâÈ­°¡ ³¡³ª¸é »õ »ç¿ëÀÚ°¡ Á¢¼ÓÇϱ⸦ ¹«ÇÑÈ÷ ±â´Ù¸°´Ù. Á¢¼ÓÀ» ±â´Ù¸®´Ù »õ·Î¿î »ç¿ëÀÚ°¡ Á¢¼ÓÇÒ ¶§¸¶´Ù ServerThread()´Â »õ·Î¿î User ¿ÀºêÁ§Æ®¸¦ ¸¸µé°í »õ·Ó°Ô ¿­¸° ¼ÒÄÏÀ» ó¸®ÇÒ UserThread()¸¦ ¸¸µç´Ù. UserThread()´Â wait_event(user.socket) ¼ÒÄÏ¿¡¼­ ¹ß»ýÇÏ´Â »ç°Ç(¼ÒÄÏÀÌ ´ÝÇû´Ù°Å³ª ¾Æ´Ï¸é ¼ÒÄÏ¿¡ Àбâ Áغñ°¡ µÇ¾ú´Ù µîÀÇ À̺¥Æ®)À» ±â´Ù¸°´Ù. À̶§ ¼ÒÄÏÀÌ ²÷±â°Å³ª ÀÐÀ» µ¥ÀÌÅÍ°¡ ¼ÒÄÏ¿¡ µé¾î¿À¸é ¹ß»ýÇÑ À̺¥Æ®¸¦ ó¸®ÇÑ´Ù. ¼ÒÄÏÀÌ ´ÝÈ÷´Â À̺¥Æ®°¡ ¹ß»ýÇÏ¸é ·çÇÁ¸¦ ¹þ¾î³ª UserThread()¸¦ ³¡³»°í, Àбâ À̺¥Æ®¶ó¸é ¼ÒÄÏÀ» ÀÐ°í³­ ÈÄ ÀÐÀº ¹®ÀÚ µ¥ÀÌÅ͸¦ ÇöÀç Á¢¼ÓÇØ ÀÖ´Â Á¢¼ÓÀÚµé(userlist°¡ º¸°üÇÏ°í ÀÖ´Â)¿¡°Ô º¸³½´Ù. ¾Ë°í¸®ÁòÀ» ¼³¸íÇÏ´Â ½´µµÄڵ忡¼­´Â ÀÌ·± Æí¸®ÇÑ ¹®¹ýÀÌ °¡´ÉÇÏÁö¸¸ ½ÇÁ¦ ÄÚµù ¶§´Â ÀÌ·¯ÇÑ ¹®¹ýÀÌ ¾øÀ¸´Ï ÀÌ·¸°Ô ½±°Ô ±¸ÇöÇÏ´Â °ÍÀÌ ¾î·Æ´Ù°í »ý°¢ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ WSA(Windows Socket API)¸¦ »ç¿ëÇÏ¸é ¼ÒÄÏ Çڵ鿡 ƯÁ¤ À̺¥Æ®¸¦ ¼³Á¤ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ÀÌ°ÍÀº ´ÙÀ½ ¿¹Á¦¿¡¼­ ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù. userlist ¿ÀºêÁ§Æ®´Â »ç¿ëÀÚÀÇ ¸®½ºÆ®¸¦ °ü¸®ÇÏ´Â ¿ÀºêÁ§Æ®·Î ¿©·¯ °³ÀÇ ½º·¹µå°¡ »ç¿ëµÇ±â ¶§¹®¿¡ ³»ºÎÀûÀ¸·Î´Â CRITICAL_SECTIONÀ̳ª ¹ÂÅؽº(mutex) ¶Ç´Â ¼¼¸¶Æ÷¾î(semaphore)°°Àº ¶ô(lock)À» »ç¿ëÇؼ­ ¿©·¯ °³ÀÇ ½º·¹µå°¡ µ¿½Ã¿¡ userlist¿¡ Á¢±ÙÇÏ´õ¶óµµ µ¥ÀÌÅÍÀÇ ¹«°á¼ºÀ» º¸ÀåÇØ¾ß ÇÑ´Ù. À§ÀÇ ¿¹´Â äÆü­¹ö¸¦ ¸¸µé±â À§ÇÑ ¾Ë°í¸®ÁòÀÌÁö¸¸ ¸î °¡Áö Ãß°¡ »çÇ×À» Á¦¿ÜÇÏ°í´Â ±×·¡ÇÈ ¸Óµå ¼­¹ö¸¦ ¸¸µå´Â °Í°ú º°·Î ´Ù¸£Áö ¾Ê´Ù. äÆà ¼­ºñ½º¿¡¼­´Â äÆà ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®´Â ´©°¡ ¹«½¼ ¸»À» Çß´ÂÁö¿¡ ´ëÇÑ ¹®ÀÚ¿­¿¡ °üÇÑ Á¤º¸¸¸ ÁÖ°í¹Þ´Â´Ù. äÆà Ŭ¶óÀ̾ðÆ®´Â »ç¿ëÀÚ°¡ ŸÀÌÇÎÇÑ ¹®ÀÚ¿­À» äÆà ¼­¹ö¿¡ º¸³»°í äÆà ¼­¹ö´Â Àü´Þ¹ÞÀº ¹®ÀÚ¿­À» Á¢¼ÓÇØ ÀÖ´Â »ç¿ëÀڵ鿡°Ô ÀüÇØÁØ´Ù. ±×·¡ÇÈ ¸ÓµåÀÇ ¼­¹ö/Ŭ¶óÀ̾ðÆ®µµ º°¹Ý ´Ù¸£Áö ¾Ê´Ù. Àü´ÞµÇ°í ÁÖ°í¹Þ´Â µ¥ÀÌÅÍ°¡ ´ÜÁö ¹®ÀÚ¿­ÀÌ ¾Æ´Ï¶ó ¿©·¯ °¡Áö ŸÀÔÀÇ ÆÐŶÀ̶ó´Â °ÍÀÌ ´Ù¸¦ »ÓÀÌ´Ù. ¸®½ºÆ® 7Àº UserThread()ÀÇ ±×·¡ÇÈ ¸Óµå¿ë ¹öÀüÀÌ´Ù. ±×·³ ½ÇÁ¦ ±¸ÇöµÈ °£·«È­µÈ ÇüÅÂÀÇ ¸Ó±× Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö¸¦ º¸ÀÚ(±×¸² 1). Ŭ¶óÀ̾ðÆ®´Â °ÔÀÓÈ­¸é°ú äÆó»¿ë, ¸Þ½ÃÁö°¡ ³ªÅ¸³ª´Â ·Î±×(log)â, ±×¸®°í äÆà ³»¿ëÀ» ÀÔ·ÂÇÏ´Â ÀÔ·ÂâÀÇ ±¸¼ºÀ¸·Î µÇ¾îÀÖ´Ù. client.exe¸¦ ½ÇÇàÇÑ ÈÄ file ¸Þ´º¿¡¼­ loginÀ» ¼±ÅÃÇÏ¸é ±×¸² 2ÀÇ ´ëÈ­»óÀÚ°¡ ¿­¸°´Ù. Address¿¡ ¼­¹öÀÇ ÁÖ¼Ò¸¦ ÀÔ·ÂÇÏ°í Name¿¡ ¿øÇÏ´Â °ÔÀÓ ³»ÀÇ Ä³¸¯ÅÍ À̸§À» ÀÔ·ÂÇÏ°í È®ÀÎ ¹öÆ°À» ´©¸£¸é º» °ÔÀÓ¿¡ Á¢¼ÓÇÏ°Ô µÈ´Ù. Å×½ºÆ® ¼­¹ö/Ŭ¶óÀ̾ðÆ®°¡ Áö¿øÇÏ´Â ±â´ÉÀº äÆðú ij¸¯ÅÍÀÇ À̵¿»ÓÀ¸·Î °ø°Ý°°Àº °ÍÀº µÇÁö ¾Ê´Â´Ù. ij¸¯ÅÍ¿Í ¹è°æµµ ±×·¡ÇÈ À̹ÌÁö°¡ ¾Æ´Ï¶ó ¾Æ½ºÅ° ÄÚµå·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ¹æÇâÅ°¸¦ ´©¸£¸é ´©¸¥ ¹æÇâÀ¸·Î ij¸¯ÅÍ(UÀÚ)°¡ À̵¿ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ¸¸¾à À̵¿ÇÒ À§Ä¡¿¡ ´Ù¸¥ À¯Àú°¡ Àְųª º®ÀÌ ÀÖ´Ù¸é ij¸¯ÅÍ´Â ¿òÁ÷ÀÌÁö ¾Ê´Â´Ù. ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® Áß Å¬¶óÀ̾ðÆ® ÂÊÀº ¿ÀÁ÷ ¼­¹ö¿Í Åë½Å¸¸ ÇÏ´Â ÀϹÝÀûÀÎ À©¼Ó(Winsock) ÇÁ·Î±×·¥À̱⠶§¹®¿¡ º°´Ù¸¥ Å×Å©´ÐÀÌ »ç¿ëµÇÁö ¾Ê¾Ò´Ù. µû¶ó¼­ ÀÌ ±Û¿¡¼­´Â ¼­¹ö ÂÊÀ» ÁßÁ¡ÀûÀ¸·Î ¼³¸íÇÏ°Ú´Ù. ¸®½ºÆ® 8Àº ServerThread()¸¦ ½ÇÁ¦·Î ±¸ÇöÇÑ ÄÚµå·Î Ŭ¶óÀ̾ðÆ®/¼­¹ö Áß ¼­¹öÀÇ ÄÚµå·Î server.cpp¿¡ ÀÖ´Â ÇÔ¼ö´Ù. ¾Ë°í¸®ÁòÀº ¸®½ºÆ® 6ÀÇ ½´µµÄÚµå¿Í °ÅÀÇ ºñ½ÁÇϹǷΠ¾Ë°í¸®Áò ÀÚüÀÇ ÀÌÇØ¿¡´Â ¾î·Á¿òÀÌ ¾øÀ» °ÍÀÌ´Ù. ServerThread()´Â ¼­¹öÀÇ ¸ÞÀÎ À©µµ¿ì°¡ ¸¸µé¾îÁø ÈÄ¿¡ ½º·¹µå·Î ½ÇÇàµÇ´Â ÇÔ¼ö·Î ¿ì¸®°¡ ¸¸µé ¸Ó±× ¼­¹öÀÇ ¸ÞÀÎ ·çƾÀÌ´Ù. Winsock ºÎºÐÀº ÀüÇüÀûÀÎ Winsock ¼­¹öÀÇ ÄÚµåµéÀÌ´Ù. WSAStartup()À¸·Î WinsockÀ» ÃʱâÈ­½ÃÅ°°í, ¼ÒÄÏ(socket() Å×½ºÆ® ¼­¹ö°¡ »ç¿ëÇÏ´Â 1001¹øÀÌ´Ù)À» ¿­°í, À̸§À» Á¤ÇÏ°í(bind()) Á¢¼ÓÀ» ±â´Ù¸®°í(listen()), Á¢¼ÓÀÌ ½ÅûµÇ¸é Çã¶ôÇÑ´Ù(accept()). »õ·Î¿î Á¢¼ÓÀÌ »ý±â¸é new User(hSocket)·Î »õ À¯Àú ¿ÀºêÁ§Æ®¸¦ ¸¸µé°í g_world¿¡ µî·ÏÇÑ´Ù. ±×¸®°í µî·ÏÇÑ Å¬¶óÀ̾ðÆ®¿¡ Á¢¼ÓÇÑ À¯ÀúÀÇ À̸§À» ¹¯´Â ÆÐŶ S_NAMEÀ» º¸³½´Ù. g_world´Â Àüü °ÔÀÓ¼¼°è¿¡ ÀÖ´Â ¸ðµç ¿ÀºêÁ§Æ®¸¦ °ü¸®Çϴ Ŭ·¡½ºÀÇ ÀνºÅϽº·Î Á¢¼ÓÇÑ »ç¶÷µéÀÇ À̸§/À§Ä¡/id¸¦ °¡Áö°í ÀÖ°í, Àüü °ÔÀÓ ³»ÀÇ ¸Ê(map) µ¥ÀÌÅ͸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ¸Ê µ¥ÀÌÅ͸¦ ÀÌ¿ëÇؼ­ »ç¿ëÀÚÀÇ Ä³¸¯ÅÍ À̵¿½Ã º®À̳ª Àå¾Ö¹° ¶Ç´Â Á¢¼ÓÇØ ÀÖ´Â ´Ù¸¥ »ç¿ëÀÚÀÇ Ä³¸¯Å͵é°úÀÇ Ã浹üũ¸¦ ÇÑ´Ù. ServerThread()´Â »õ Á¢¼ÓÀÚÀÇ µî·ÏÀÌ ³¡³ª¸é Á¢¼ÓÇÑ »ç¶÷º°·Î UserThread() ½º·¹µå¸¦ ½ÇÇàÇÑ´Ù. ÀÌ Å×½ºÆ®¿ë Ŭ¶óÀ̾ðÆ®/¼­¹ö ȯ°æ¿¡¼­ »ç¿ëµÇ´Â ÆÐŶÀº ¾Æ·¡¿Í °°Àº ±¸Á¶·Î µÇ¾î ÀÖ´Ù. ÆÐŶÀÇ Ã³À½ 2¹ÙÀÌÆ®´Â Àüü ÆÐŶÀÇ ±æÀÌ°¡ ÀúÀåµÇ°í, ¼¼ ¹ø° ¹ÙÀÌÆ®¿¡´Â ÆÐŶÀÇ ¹øÈ£°¡ ÀúÀåµÈ´Ù. ³× ¹ø° ¹ÙÀÌÆ®ºÎÅÍ ÆÐŶÀÇ ³¡±îÁö´Â ÆÐŶÀÇ ¸öü(body)°¡ ÀúÀåµÈ´Ù. User::Send(char)´Â ÆÐŶ¸öü°¡ ¾ø´Â ÆÐŶÀ» º¸³»´Â ÇÔ¼ö´Ù. ÆÐŶ¸öü°¡ ¾ø°í ÆÐŶ¹øÈ£¸¸ º¸³»±â ¶§¹®¿¡ ÀÌ ÇÔ¼ö·Î º¸³»Áö´Â ÆÐŶÀº Ç×»ó 3¹ÙÀÌÆ®ÀÇ Å©±â¸¸ °¡Áø´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¼­¹ö¿¡¼­ Ŭ¶óÀ̾ðÆ®·Î Àü´ÞµÇ´Â ÆÐŶ Áß S_MOVE¶ó´Â ÆÐŶÀÌ ÀÖ´Ù. ÀÌ ÆÐŶÀº ¿òÁ÷ÀÎ À¯ÀúÀÇ id(4¹ÙÀÌÆ®)¿Í x(4¹ÙÀÌÆ®), y(4¹ÙÀÌÆ®)·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÀÌ ÆÐŶÀ» ÀÎÄÚµùÇÏ´Â ÇÔ¼ö´Â ¾Æ·¡¿Í °°´Ù(SetChar(), SetInteger(), SetShort(), GetChar(), GetInteger(), GetShort()´Â ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®°¡ °øÅëÀ¸·Î »ç¿ëÇÏ´Â util.cpp¿¡ ÀÖ´Ù). char szPacket[512]; char* pPacket = szPacket + 2; pPacket = SetChar(pPacket, S_MOVE); // 3¹ø° ¹ÙÀÌÆ®¿¡ ÆÐŶ¹øÈ£ pPacket = SetInteger(pPacket, pUser->Id()); // 4¹ø° ¹ÙÀÌÆ®ºÎÅÍ id pPacket = SetInteger(pPacket, pUser->X()); // 8¹ø° ¹ÙÀÌÆ®ºÎÅÍ x pPacket = SetInteger(pPacket, pUser->Y()); // 12¹ø° ¹ÙÀÌÆ®ºÎÅÍ y SetShort(szPacket, pPacket - szPacket); // 0¹ø°¿¡ 2¹ÙÀÌÆ®ÀÇ ÆÐŶ ±æÀÌ Å¬¶óÀ̾ðÆ® Ãø¿¡¼­ S_MOVE ÆÐŶÀÇ µðÄÚµùÀº ¾Æ·¡¿Í °°´Ù. Int nId; int nX; int nY; pPacket = GetInteger(pPacket, nId); pPacket = GetInteger(pPacket, nX); pPacket = GetInteger(pPacket, nY); WSAEVENT hEvents[] = { hEvent1, hEvent2, hEvent3 }; ... WSAWaitForMultipleEvents(3, hEvents, FALSE, WSA_INFINITE, FALSE); ... ¸®½ºÆ® 7 : ±×·¡Çȸӵå¿ë UserThread() ½´µµÄÚµå UserThread(user) { while (true) { event = wait_event(user.socket) // ¼ÒÄÏÀÇ À̺¥Æ®¸¦ ±â´Ù¸°´Ù if (event == event_close) { // ¼ÒÄÏÀÌ ´ÝÈ÷¸é... userlist.delete(user) // »ç¿ëÀÚ »èÁ¦ break // ·çÇÁ¸¦ ¹þ¾î³­´Ù } else if (event == event_read) { // Àбâ À̺¥Æ® ¹ß»ý packet = read_socket() // ¼ÒÄÏÀ» Àд´٠user.packet(packet) } } } user::packet(packet) { switch (packet) { case move : move(packet); // user¸¦ À̵¿ÇÑ´Ù userlist.seemove(user); // Á¢¼ÓÀڵ鿡°Ô ¿òÁ÷ÀÓÀ» ¾Ë¸°´Ù break; case say : userlist.seesay(packet); // äÆÃÀ» ó¸®ÇÑ´Ù break; } } ¸®½ºÆ® 8 : server.cppÀÇ ÀϺΠWSA·Î ½ÃÀÛÇÏ´Â ÇÔ¼öµéÀº Win32¿¡¼­ Áö¿øÇÏ´Â À©¼Ó ÇÔ¼öµéÀÌ´Ù. WSAEventSelect() ÇÔ¼ö´Â ¼ÒÄÏÇڵ鿡 ³×Æ®¿öÅ© À̺¥Æ®°¡ Á¤ÀÇµÈ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ¼³Á¤ÇÑ´Ù. ¼³Á¤ÇÑ ¼ÒÄÏ¿¡ ÁöÁ¤ÇÑ ³×Æ®¿öÅ© À̺¥Æ®°¡ ¹ß»ýÇϸé À̺¥Æ® ¿ÀºêÁ§Æ®¿¡ ½ÅÈ£(signal)°¡ ¼¼ÆõȴÙ. µû¶ó¼­ ¸¸¾à ÀÌ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ±â´Ù¸®°í ÀÖ´Â ÇÁ·Î¼¼½º°¡ ÀÖ´Ù¸é ±× ÇÁ·Î¼¼½º´Â ´ë±â»óÅ¿¡¼­ ¹þ¾î³ª°Ô µÈ´Ù. WSAEVENT hRecvEvent = WSACreateEvent(); ... WSAEventSelect(pUser->Socket(), hRecvEvent, FD_READ | FD_CLOSE); pUser->Socket()Àº ¼ÒÄÏÇÚµéÀ» ¸®ÅÏÇÏ´Â User Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö´Ù. À§ÀÇ ÄÚµå´Â hRecvEvent À̺¥Æ® ¿ÀºêÁ§Æ®¿¡ FD_READ¿Í FD_CLOSE ³×Æ®¿öÅ© À̺¥Æ®¸¦ ¼³Á¤ÇÏ°í pUser->Socket() ¼ÒÄÏ¿¡ hRecvEvent ¿ÀºêÁ§Æ®¸¦ ¿¬°áÇÑ´Ù. ÀÌ·¸°Ô Çϸé pUser->Socket()¿¡ Àбâ Áغñ°¡ µÇ¾ú°Å³ª ¼ÒÄÏÀÌ ´ÝÈ÷¸é hRecEvent À̺¥Æ®°¡ ¹ß»ýÇÑ´Ù. À̶§ ÁÖÀÇÇÒ °ÍÀº ÇϳªÀÇ ¼ÒÄÏ¿¡´Â ÇϳªÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¸¸ ¿¬°áÀÌ °¡´ÉÇÏ´Ù. Áï, ¾Æ·¡¿Í °°Àº ÄÚµå´Â À߸øµÈ ÄÚµå´Ù. WSAEventSelect(hSocket, hEvent1, FD_READ); WSAEventSelect(hSocket, hEvent2, FD_CLOSE); µÎ ¹ø° ÁÙÀÌ ½ÇÇàµÉ ¶§ ùÁÙ¿¡¼­ Á¤ÀÇÇÑ FD_READ À̺¥Æ®´Â Ãë¼ÒµÇ°í hEvent2¿¡ Á¤ÀÇµÈ FD_CLOSE ³×Æ®¿öÅ© À̺¥Æ®¸¸ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÑ´Ù. ¼ÒÄÏ¿¡ Á¤ÀÇµÈ À̺¥Æ®¸¦ ¸ðµÎ Ãë¼ÒÇÏ°í ½Í´Ù¸é ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù. WSAEventSelect(hSocket, hEvent, 0); ³×Æ®¿öÅ© À̺¥Æ®¸¦ ±â´Ù¸®´Â ÇÔ¼ö´Â ¾Õ¿¡¼­ ´Ù·ç¾ú´ø WaitForMultipleObject()¿Í ºñ½ÁÇÑ ±â´ÉÀ» Çϸç ÇÑ °³ ÀÌ»óÀÇ º¹¼ö À̺¥Æ®¸¦ ±â´Ù¸± ¼ö ÀÖ´Ù. ³×Æ®¿öÅ© À̺¥Æ®¸¦ ±â´Ù¸®´Â ÇÔ¼ö¿¡´Â WaitForSingleObject()¿Í °°ÀÌ ÇÑ °³ÀÇ À̺¥Æ®¸¸ ±â´Ù¸®´Â ÇÔ¼ö´Â ¾ø´Ù. WSAWaitForMultipleEvents(1, &hRecvEvent, FALSE, WSA_INFINITE, FALSE); WSAWaitForMultipleEvents()¿¡¼­ »ç¿ëµÇ´Â ÆĶó¹ÌÅÍ ¿ª½Ã WaitForMultipleObject()¿Í ºñ½ÁÇÏ´Ù. ù ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± À̺¥Æ® ¿ÀºêÁ§Æ®ÀÇ °¹¼ö, µÎ ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± À̺¥Æ® ¿ÀºêÁ§Æ®µéÀÇ ½ÃÀÛÁÖ¼Ò, ¼¼ ¹ø° ÆĶó¹ÌÅÍ´Â ¸ðµç ¿ÀºêÁ§Æ®¸¦ ±â´Ù¸± °ÍÀÎÁö ¾Æ´Ï¸é ¿ÀºêÁ§Æ®µé ÁßÀÇ Çϳª¸¸ ±â´Ù¸±Áö¸¦ °áÁ¤ÇÑ´Ù. ³× ¹ø° ÆĶó¹ÌÅÍ´Â ±â´Ù¸± ½Ã°£ÀÌ´Ù. WSA_INFINITE°ªÀ» ÁÖ¸é ¿µ¿øÈ÷ ±â´Ù¸®°Ô µÈ´Ù. ¸®ÅÏ°ªÀº DWORD°ªÀ¸·Î ¹ß»ýÇÑ À̺¥Æ®ÀÇ ¼ø¼­¸¦ ÀǹÌÇÑ´Ù. ¸®½ºÆ® 10¿¡¼­´Â ÇÑ °³ÀÇ ¿ÀºêÁ§Æ®¸¦ ±â´Ù¸®°í ÀÖÀ¸¹Ç·Î Ç×»ó 0À» ¸®ÅÏÇÒ °ÍÀÌ´Ù. ¾Õ¿¡¼­¿Í °°ÀÌ 3°³ÀÇ À̺¥Æ®¸¦ ±â´Ù¸®°í ÀÖÀ» °æ¿ì µÎ ¹ø° À̺¥Æ®ÀÎ hEvent2°¡ ¹ß»ýÇÏ¸é ¸®ÅÏ°ªÀº 1ÀÌ µÉ °ÍÀÌ´Ù. WSAEnumNetworkEvents(pUser->Socket(), hRecvEvent, &event); ÇÑ °³ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¿¡ ¿©·¯ °³ÀÇ ³×Æ®¿öÅ© À̺¥Æ®¸¦ ÁöÁ¤Çϱ⠶§¹®¿¡ ½ÇÁ¦ ¹ß»ýÇÑ ³×Æ®¿öÅ© À̺¥Æ®¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â WSAEnumNetworkEvents()À» ÀÌ¿ëÇؼ­ ¹ß»ýÇÑ À̺¥Æ®ÀÇ »ó¼¼ Á¤º¸¸¦ ¾Ë¾Æ³»¸é µÈ´Ù. À§ÀÇ ÄÚµå´Â event structure¿¡ ¹ß»ýÇÑ À̺¥Æ®ÀÇ »ó¼¼Á¤º¸¸¦ ä¿î´Ù. event.lNetworkEvents¿¡ ½ÇÁ¦ ¹ß»ýÇÑ À̺¥Æ®ÀÇ °ªÀÌ ÀúÀåµÈ´Ù. FD_CLOSE À̺¥Æ® ó¸® ¶§ Áß¿äÇÑ °ÍÀº ¼ÒÄÏÀÌ ´ÝÇô FD_CLOSE À̺¥Æ®°¡ ¹ß»ýÇÏ´õ¶óµµ ¾ÆÁ÷ ¼ÒÄÏÀÇ ¹öÆÛ¿¡ ÀÐÁö ¾ÊÀº ÆÐŶÀÌ ³²¾Æ ÀÖÀ» ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î FD_CLOSE À̺¥Æ®°¡ ¹ß»ýÇؼ­ ¼ÒÄÏÀÌ ²÷¾îÁø °ÍÀÌ È®ÀεǴõ¶óµµ recv()¿¡¼­ -1ÀÌ ¸®Å쵃 ¶§±îÁö recv()¸¦ ÄÝÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¸®½ºÆ® 11Àº world.cpp¿Í world.hÀÇ ÀϺÎÀÌ´Ù. World Ŭ·¡½º´Â Á¢¼ÓÇÑ »ç¿ëÀÚµéÀÇ µ¥ÀÌÅÍ¿Í Àüü ¿ùµåÀÇ ¸Ê µ¥ÀÌÅ͸¦ °ü¸®ÇÑ´Ù. ¸Ê µ¥ÀÌÅʹ ij¸¯ÅÍÀÇ À̵¿½Ã ´Ù¸¥ ij¸¯ÅÍ¿Í º®µé °£ÀÇ Ã浹üũ¿¡ »ç¿ëµÈ´Ù. m_mapUser´Â C++ÀÇ standard library¸¦ »ç¿ëÇؼ­ ¸¸µç ¿ÀºêÁ§Æ®·Î Á¢¼ÓÇÑ À¯ÀúÀÇ ID°ªÀ» Å°°ªÀ¸·Î User µ¥ÀÌÅ͸¦ ÀÌÁøÆ®¸®¿¡ ³Ö¾î °ü¸®ÇÑ´Ù(standard library¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº C++ ·¹ÆÛ·±½º °¡À̵带 Âü°íÇϱ⠹ٶõ´Ù). m_mapUser ¿ÀºêÁ§Æ®¿Í ¸Ê µ¥ÀÌÅÍÀÎ g_pszMapÀº µ¿½Ã¿¡ ¿©·¯ °³ÀÇ ½º·¹µå¸¦ »ç¿ëÇϱ⠶§¹®¿¡ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î °ü¸®ÇÏ°í ÀÖ´Ù. ¸¸¾à m_mapUser ¿ÀºêÁ§Æ®¸¦ Å©¸®Æ¼Äà ¼½¼ÇÀ» ÀÌ¿ëÇؼ­ Çѹø¿¡ ÇÑ ½º·¹µå°¡ Á¢±ÙÇÏ°Ô º¸È£ÇÏÁö ¾ÊÀ¸¸é ÇÑ ½º·¹µå°¡ µ¥ÀÌÅ͸¦ »ðÀÔÇÏ°í ÀÖ´Â µ¿½Ã¿¡ ¶Ç ´Ù¸¥ ½º·¹µå°¡ µ¥ÀÌÅ͸¦ »èÁ¦ÇÏ·Á´Â ½Ãµµ¸¦ ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·¸°Ô µÇ¸é m_mapUserÀÇ ÀÌÁøÆ®¸® ±¸Á¶´Â ±úÁö°Ô µÇ°í À߸øµÈ ¸Þ¸ð¸® ¾×¼¼½º·Î ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÈ´Ù. World::AddUser()¿¡¼­´Â »õ·Î¿î À¯Àú°¡ Ãß°¡µÉ ¶§ »õ·Ó°Ô Ãß°¡µÇ´Â À¯Àú¿¡ ID°ªÀ» ºÎ¿©ÇÏ°Ô µÇ´Âµ¥ ID°ªÀº m_nId °ªÀ» InterlockedIncrement()À» ÀÌ¿ëÇؼ­ Çϳª¾¿ Áõ°¡½ÃÅ°¸é¼­ ¾ò´Â´Ù. World::Remove() ¸â¹ö ÇÔ¼ö´Â UserThread()¿¡¼­ ¼ÒÄÏÀÌ ²÷¾îÁ³À» °æ¿ì¿¡ ºÒ·ÁÁø´Ù. m_mapUser¿¡¼­ ¼ÒÄÏÀÌ ²÷¾îÁø User ¿ÀºêÁ§Æ®¸¦ »èÁ¦ÇÏ°í ÇöÀç Á¢¼ÓÇØ ÀÖ´Â ¸ðµç À¯Àúµé¿¡°Ô ÀÌ »ç½ÇÀ» ¾Ë·Á Ŭ¶óÀ̾ðÆ®µéÀÇ È­¸é¿¡¼­ Á¢¼ÓÀÌ ²÷±ä À¯ÀúÀÇ Ä³¸¯ÅÍ°¡ »ç¶óÁö°Ô ÇÑ´Ù. World::Enter()´Â ¹Ý´ë·Î »õ·Î¿î À¯Àú°¡ Á¢¼ÓÇßÀ» °æ¿ì Àüü À¯Àúµé¿¡°Ô »õ À¯ÀúÀÇ Á¢¼ÓÀ» ¾Ë¸°´Ù. ³×Æ®¿öÅ© °ÔÀÓ¿¡¼­ ÆÐŶÀÇ ¾çÀÌ ¸¹¾ÆÁö°í ÆÐŶÀÇ Å©±â°¡ Ä¿Áö¸é Ä¿Áú¼ö·Ï ÇÊ¿¬ÀûÀ¸·Î ³×Æ®¿öÅ© Æ®·¡ÇÈ Áõ°¡°¡ µû¸£°Ô µÈ´Ù. Å×½ºÆ® ¼­¹öÀÇ °æ¿ì »ç¿ëµÇ°í Àִ ij¸¯ÅÍÀÇ Á¤º¸´Â À̸§¹Û¿¡ ¾ø±â ¶§¹®¿¡ º° ¹®Á¦°¡ ¾øÁö¸¸, ½ÇÁ¦ °ÔÀÓ¿¡¼­´Â ij¸¯ÅÍÀÇ ½ºÇÁ¶óÀÌÆ® Á¤º¸´Â ¹°·ÐÀÌ°í ÇöÀçÀÇ »óÅÂ, HP, MP µî º¸³»¾ßÇÒ µ¥ÀÌÅÍ°¡ ¸¹À» »Ó¸¸ ¾Æ´Ï¶ó ÇÑ È­¸é¿¡ ¼ö½Ê¸íÀÇ Ä³¸¯ÅÍ°¡ ÀÖÀ» ¼ö ÀÖ´Ù. ±×·¸±â ¶§¹®¿¡ ij¸¯ÅÍÀÇ Á¤º¸¸¦ °è¼Ó º¸³»´Â °ÍÀÌ ¾Æ´Ï¶ó óÀ½ È­¸é¿¡ ³ªÅ¸³¯ ¶§ ij¸¯ÅÍÀÇ Á¤º¸¸¦ º¸³»°í ´ÙÀ½¿¡ ±× ij¸¯ÅÍÀÇ »óÅ°¡ º¯ÇÒ ¶§(¿òÁ÷À̰ųª È­¸éÀ» ¹þ¾î³ª°Å³ª ±×·¡ÇÈ µ¥ÀÌÅÍ°¡ º¯°æµÇ°Å³ª)´Â ¹Ù²ï ij¸¯ÅÍÀÇ ID °ª°ú »õ·Î¿î »óŸ¸À» º¸³»ÁØ´Ù. ÀÌ Å×½ºÆ® ¼­¹ö¿¡¼­µµ »õ·Î¿î À¯Àú°¡ Á¢¼ÓÇÒ ¶§ S_ENTER ÆÐŶ¿¡¼­ ij¸¯ÅÍÀÇ À̸§°ú À§Ä¡¸¦ º¸³½ ÈÄ ´ÙÀ½ ÆÐŶºÎÅʹ ij¸¯ÅÍ¿Í ID °ª¸¸ °¡Áö°í Åë½ÅÀ» ÇÏ°Ô µÈ´Ù. ¸®½ºÆ® 11 : world Ŭ·¡½º ¸¶Ä¡¸ç ÀÌ ±Û¿¡¼­ »ç¿ëµÈ Å×½ºÆ®¿ë ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®´Â »ç½Ç ¹Ì¿Ï¼º ¹öÀüÀÌ´Ù. ÀüÅõ³ª HP °ü¸®, »ç¿ëÀÚ µ¥ÀÌÅÍÀÇ ÀúÀå, NPC ó¸® µî ±¸ÇöµÇÁö ¾ÊÀº °Í Åõ¼ºÀÌ´Ù. óÀ½ ÀÌ ±ÛÀ» ½ÃÀÛÇÒ ¶§ ±¸ÇöÇÏ°í ½Í¾ú´ø °ÍÀº ³×Æ®ÇÙ(Nethack)ÀÇ ¸ÖƼÀ¯Àú ¹öÀüÀ̾ú´Ù. ÀÌ ±ÛÀ» Àд µ¶ÀÚµé Áß ¸ÖƼÀ¯Àú °ÔÀÓÀÇ °³¹ß¿¡ °ü½ÉÀÌ ÀÖ´Â »ç¶÷À̶ó¸é ÀÌ ¹Ì¿Ï¼º ÇÁ·Î±×·¥À» ¹ßÀü½ÃÄÑ ¿ÏÀüÇÑ ÇüÅÂÀÇ ³×Æ®ÇÙ ¼­¹ö/Ŭ¶óÀ̾ðÆ®¸¦ ¸¸µå´Â °Í¿¡ µµÀüÇغ¸±æ ±â´ëÇÏ¸ç ±ÛÀ» ¸¶Ä¡°Ú´Ù. ÇÁ·Î¼¼½º°£ µ¿±âÈ­ (Interprocess Synchronization) ¸ÖƼ¾²·¹µå ȯ°æ¿¡¼­ ¼¼¸¶Æ÷¾î, ¹ÂÅؽº¿Í Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ®´Â ¾î¶»°Ô ´Ù¸¥°¡ »ìÆ캸ÀÚ. ¾Æ·¡ ÄÚµå´Â ÀüÇüÀûÀÎ ¹ÂÅؽº ¿ÀºêÁ§Æ®ÀÇ »ç¿ë¹æ¹ýÀÌ´Ù. hMutex = CreateMutex (NULL, FALSE, ¡°MyMutexObject¡±); // ¹ÂÅؽº ¿ÀºêÁ§Æ®¸¦ ¸¸µç´Ù. ... unsigned __stdcall thread1() { ... WaitForSingleObject(hMutex, INFINITE); // Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÁøÀÔ ... ReleaseMutex(hMutex); // Å©¸®Æ¼Äà ¼½¼ÇÀ» ºüÁ®³ª¿Â´Ù. ... } ... CloseMutex(hMutex); // »ç¿ëÀÌ ³¡³­ ¹ÂÅؽº ¿ÀºêÁ§Æ®¸¦ ¾ø¾Ø´Ù. ¹ÂÅؽº ¿ÀºêÁ§Æ®´Â ¸¸µé¾îÁú ¶§ ÀÌ¹Ì ½ÅÈ£(signal)°¡ ¼ÂÆ®µÇ¾î ÀÖ´Â »óÅ´Ù. µû¶ó¼­ óÀ½ WaitiForSingleObject(hMutex)¸¦ ÄÝ(call)ÇÏ´Â ¾²·¹µå´Â ±â´Ù¸²¾øÀÌ ¹Ù·Î Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î µé¾î°¥ ¼ö ÀÖ´Ù. ±×¸®°í ReleaseMutex(hMutex)¸¦ ÄÝÇϱâ Àü±îÁö ½ÅÈ£(signal)´Â ¸®¼ÂµÇ¾î ÀÖ´Â »óÅÂÀ̱⠶§¹®¿¡ ´Ù¸¥ ¾²·¹µåµéÀº ÀÌ Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÁøÀÔÇÒ¼ö ¾ø´Ù. ¹ÂÅؽº ¿ÀºêÁ§Æ®¿Í Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ® ¸ðµÎ Å©¸®Æ¼Äà ¼½¼ÇÀÇ ±â´ÉÀ» ¼öÇàÇÏ°í »ç¿ë¹ýµµ ºñ½ÁÇØ º¸ÀδÙ. µÑ °£ÀÇ Â÷ÀÌ´Â ¹ÂÅؽº ¿ÀºêÁ§Æ®´Â interprocess synchronization (ÇÁ·Î¼¼½º°£ µ¿±âÈ­)°¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ®ÀÌ°í, Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ®´Â ±×·¸Áö ¾Ê´Ù´Â °ÍÀÌ´Ù. CreateMutex()ÀÇ 3¹ø° ÆĶó¹ÌÅÍ´Â ¿ÀºêÁ§Æ®ÀÇ À̸§À» ½ºÆ®¸µÀ¸·Î ÁöÁ¤ÇÏ´Â Ç׸ñÀÌ´Ù(NULL°ªÀ¸·Î ¸¸µé¸é ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ ÀÌ ¿ÀºêÁ§Æ®¸¦ ãÀ»¼ö ¾ø´Ù). ÀÌ·¸°Ô ¸¸µé¾îÁø ¿ÀºêÁ§Æ®´Â ÁöÁ¤ÇÑ À̸§À¸·Î OSÀÇ Ä¿³Î¿¡ µî·ÏµÇ¾î ¿©·¯ ÇÁ·Î¼¼½º°¡ ÀÌ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ¸¸¾à ÇÁ¸°Æ®¸¦ ÇÏ·Á´Â ÇÁ·Î±×·¥ÀÌ 2°³ ÀÌ»óÀÌ ÀÖ´Ù¸é? ¿©·¯ ÇÁ·Î±×·¥ÀÌ °¢ÀÚÀÇ À©µµ¿ì¿¡ ¹º°¡¸¦ ±×¸®·Á°í µ¿½Ã¿¡ ½ÃµµÇÑ´Ù¸é? ¸ðµÎ´Ù ÈçÈ÷ ¹ß»ýÇÏ´Â ÀÏÀÌ´Ù. À̶§ ÇÁ·Î¼¼½º°£ µ¿±âÈ­°¡ ÇÊ¿äÇÏ´Ù. OpenMutex(),OpenSemaphore(),OpenEvent()¿Í °°Àº APIµéÀ» »ç¿ëÇÏ¸é ¿ÀºêÁ§Æ®ÀÇ À̸§À¸·Î ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ ¸¸µç ¿ÀºêÁ§Æ®ÀÇ ÇÚµéÀ» ¾òÀ»¼ö ÀÖ´Ù. unsigned __stdcall thread2() { hMutex = OpenMutex(NULL, FALSE, ¡°MyMutexObject); WaitForSingleObject(hMutex, INFINITE); // Å©¸®Æ¼Äà ¼½¼ÇÀ¸·Î ÁøÀÔ ... ReleaseMutex(hMutex); // Å©¸®Æ¼Äà ¼½¼ÇÀ» ºüÁ®³ª¿Â´Ù. } ¹ÂÅؽº ¿ÀºêÁ§Æ®´Â Ä¿³Î¿¡¼­ ¸¸µé¾îÁö°í Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ®´Â ÇÁ·Î¼¼¼­¿¡¼­ ¸¸µé¾îÁö±â ¶§¹®¿¡ ÇÁ·Î¼¼½º°£ µ¿±âÈ­°¡ ÇÊ¿äÇÏÁö ¾ÊÀ» °æ¿ì Å©¸®Æ¼Äà ¼½¼Ç ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¼Óµµ¸é¿¡¼­ ¾à°£ ºü¸£´Ù.